Java语言mysql数据库的访问步骤,一个简单的实例——使用DAO(数据库操作类 Data Access Object ) 实现对mysql数据库的增删改查
Java mysql数据库基本步骤&一个简单实例
基本步骤
-
准备工作 下载安装数据库、下载jdbc包、创建java project
推荐去mysql官网下载社区版(community)
附链接:mysql社区版下载
jar包链接
对于初学者推荐使用可视化的数据库管理工具如:Navicat 如何使用会在后面的文章介绍,这里不再赘述。
下载完成后在IDE中创建project,至此准备工作完成。后续以Eclipse为例介绍整个流程。 -
导入jar包
对于mysql的相关操作需要导入额外的jar包,在第一条中已经给出了jar包的下载。
在Eclipse中选中你新建的工程 右键——properties(在最下方)——Java Build Path——Libraries——Add External JARs——找到你下载的jar包然后应用关闭即可。
这里注意选择名字为*-bin.jar的jar包 -
创建Student类、创建StudentDAO类、mysql创建Student表
这里以存入一个学生的信息为例介绍整个过程,假如他有学号,名字,成绩,年龄四个属性。
public class Student {
public int id;
public String name;
public float grade;
public int age;
// get set方法
}
随后我们创建一个StudentDAO类,在这个类中完成对数据库的增删改查。
给出导入的包:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import bean.Student;
我们需要在构造函数中加载我们导入的jar包。
public StudentDAO() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
}
}
在对数据库进行相关操作之前我们需要在mysql数据库中创建一个Student表,来存储我们的信息。你可以在Navicat的可视化界面中创建表,也可以执行sql语句。
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) DEFAULT NULL,
`grade` float DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
-
生成connection对象
Connection用于与mysql数据库建立连接,建立连接后才能执行后续的操作。
Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/testjava?characterEncoding=UTF-8", "root", "lxz74123");
这里解释一下getConnection的参数
第一个参数:
127.0.0.1:3306 代表本机ip和端口号,如果你的数据库在服务器那么就是服务器的ip地址和端口号。
testjava是数据库的名字,mysql下面可以有很多数据库。这个数据库需要你自己在可视化界面中建立。
characterEncoding=UTF-8"是编码方式。
第二个参数:用户的名字
第三个参数:数据库的密码
-
生成Statement对象或Preparedstatement对象
Statement对象用于准备和执行sql语句,他的实例化需要借助Connection对象。
Statement s = c.createStatement();
Statement 和 Preparedstatement对象的区别在于Preparestatement可以在sql语句中留空,使用?代替,在执行sql时可以用具体的数据填充?。一般在更新操作中会用到,后面再实例中可以进一步感受,这里不再赘述。
-
准备sql语句
准备后面需要执行的sql语句,一般存储在一个字符串中。
String sql = "delete from student where id = " + id;
这个语句是查找表中id为“id”的数据
-
执行sql语句返回结果
准备好sql语句后,需要使用Statement对象来执行sql语句,然后返回结果。
ResultSet rs = s.executeQuery(sql);
这里解释一下 ResultSet,用来接收结果,此对象中有多项,使用next()函数可以访问多项内容,每一项内容中都有很多列,例如这里的话有id,name,grade,age四列。
-
处理结果
返回结果后,对ResultSet对象进行处理,得到自己想要的结果。
这里实例化一个Student来接受对象。
if (rs.next()) {
student = new Student();
student.name = rs.getString(2);
student.grade = rs.getFloat("grade");
student.age = rs.getInt(4);
student.id = id;
}
这里解释一下ResultSet对象的get函数,参数为数字时,数字代表列号,字符串时代表数据库中的字段名。也就是说这两种方式都可以从结果中获取自己的想要的数据。这里要特别注意数据类型。
如果结果集中有多条对象,将if修改为while即可。
简单实例
这里以一个学生表的增删改查为例,给出完整程序代码。
Student类:
package bean;
public class Student {
public int id;
public String name;
public float grade;
public int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getGrade() {
return grade;
}
public void setGrade(float grade) {
this.grade = grade;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 重载toString方法
public String toString() {
// TODO Auto-generated method stub
String str = "学号:" + id + " 姓名:" + name + " 成绩:" + grade + " 年龄:" + age;
return str;
}
}
StudentDAO类:
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import bean.Student;
public class StudentDAO {
// 构造函数,在实例化对象时载入jar包
public StudentDAO() {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
}
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/testjava?characterEncoding=UTF-8", "root", "lxz74123");
}
// 获取学生总数
public int getTotal() {
int total = 0;
// try-with-resource的方式,不需要再手动调用close()
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "select count(*) from student";
// 执行sql语句
ResultSet rs = s.executeQuery(sql);
while(rs.next()) {
total = rs.getInt(1);
}
System.out.println("total:" + total);
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
return total;
}
// 添加学生
public void add(Student student) {
String sql = "insert into student values(null, ?, ?, ?)";
// 因为这里要获取自增主键,所以prepareStatement有第二个参数
// Statement.RETURN_GENERATED_KEYS 告诉sql去要返回自增id
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);) {
// 填充字符串中的?,构造完整的sql语句。
ps.setString(1, student.name);
ps.setFloat(2, student.grage);
ps.setInt(3, student.age);
ps.execute();
// 获取生成的id号
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
int id = rs.getInt(1);
student.id = id;
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public void update(Student student) {
String sql = "update student set name= ?, grade = ?, age = ? where id = ?";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setString(1, student.name);
ps.setFloat(2, student.grade);
ps.setInt(3, student.age);
ps.setInt(4, student.id);
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 根据id 删除学生
public void delete(int id) {
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "delete from student where id = " + id;
s.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
// TODO: handle exception
}
}
public Student get(int id) {
Student student = null;
try (Connection c = getConnection(); Statement s = c.createStatement();) {
String sql = "select * from student where id = " + id;
ResultSet rs = s.executeQuery(sql);
if (rs.next()) {
student = new Student();
student.name = rs.getString(2);
student.grade = rs.getFloat("grade");
student.age = rs.getInt(4);
student.id = id;
}
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
return student;
}
public List<Student> list() {
// 第一个参数是开始的位置,第二个参数是获取的学生的数目。
return list(0, Short.MAX_VALUE);
}
public List<Student> list(int start, int count) {
List<Student> students = new ArrayList<Student>();
// 以id降序排列,limit限定查询范围
String sql = "select * from student order by id desc limit ?,?";
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {
ps.setInt(1, start);
ps.setInt(2, count);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Student student = new Student();
student.id = rs.getInt(1);
student.name = rs.getString(2);
student.grade = rs.getFloat("grade");
student.damage = rs.getInt(4);
// 将学生加入列表中
students.add(student);
}
} catch (SQLException e) {
// TODO: handle exception
e.printStackTrace();
}
return students;
}
}
主函数:
package dao;
import java.util.List;
import bean.Student;
import dao.StudentDAO;
public class doStudentDAO {
public static void main(String[] args) {
// list方法
List<Student> students = new StudentDAO().list();
// 在控制台打印数据
for (Student student : students) {
System.out.println(student);
}
// 其他方法依次类推
}
}
上一篇: SpringBoot学习笔记(二)
下一篇: Winform加入MS SQL连线字串