Java DbUtils 操作数据库
示例
1、新建项目,把数据库驱动、DbUtils的jar包添加到项目中
2、新建文件夹resource,标识为资源根目录,下面新建数据库连接的配置文件mysql.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/my_db?serverTimezone=GMT
user=chy
password=abcd
?serverTimezone=GMT是为了解决时区问题,GMT、UTC均可。
3、新建实体类bean.Student
package bean;
public class Student {
private int id;
private String name;
private int age;
private int score;
public Student() {
}
public Student(int id, String name, int age, int score) {
this.id = id;
this.name = name;
this.age = age;
this.score = score;
}
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", score=" + score +
'}';
}
}
DbUtils将结果集中的记录映射到JavaBean中时,采用的方式和Spring的设值注入一样:先调用空参的构造器,再调用setter()方法进行初始化。
所以一定要有空参的构造器、setter()方法,要么不写构造器,调用默认的空参构造器;如果写了带参的构造器,就必须显示写空参的构造器。
4、新建测试类test.Test
public class Test {
public static void main(String[] args) throws ClassNotFoundException, IOException, SQLException {
//从properties文件中加载数据库配置
Properties properties = new Properties();
InputStream fis = Class.forName("test.Test").getResourceAsStream("/mysql.properties");
properties.load(fis);
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String user = properties.getProperty("user");
String password = properties.getProperty("password");
DbUtils.loadDriver(driver); //静态方法加载驱动
Connection connection = DriverManager.getConnection(url, user, password); //获取连接
QueryRunner queryRunner = new QueryRunner(); //创建QueryRunner对象,增删查改都要通过QueryRunner对象来完成
//查询
String sql = "select * from student_tb where id=?";
BeanHandler<Student> studentBeanHandler = new BeanHandler<>(Student.class); //结果集处理器,将结果集中的记录映射到指定的类中
Student student = queryRunner.query(connection, sql, studentBeanHandler, 1); //执行查询,将结果集中的记录映射到JavaBean中,返回的就是目标类型,不必强转
System.out.println(student); //可通过getter()方法获取属性值(对应表中的字段值)
DbUtils.close(connection); //静态方法关闭连接
}
}
结果集处理器ResultSetHandler是一个接口,查询时处理结果集要用到这个,用来将结果集中的记录映射到指定的实体类中(JavaBean)。
BaseResultSetHandler是一个抽象类,implements ResultSethandler。要创建结果集处理器的实例,这2个都不能直接创建实例。
BaseResultSetHandler有3个子类:
- BeanHandler 将结果集中的记录映射为一个JavaBean,适合结果集中只有一条记录的情况
- BeanListHandler 将结果集中的所有记录映射为一个JavaBean的List集合,一条记录就是一个元素,就是一个JavaBean。
- BeanMapHandler 将结果集映射为JavaBean的Map集合
增删查改都是通过QueryRunner对象来实现的:
- 查:QueryRunner对象.query(数据库连接,sql语句,结果集处理器,sql语句中的?部分的参数值)
- 增、删、改:QueryRunner对象.update(数据库连接,sql语句,sql语句中?部分的参数值)
说明:
- 最后一个是个数不确定的参数,可以没有,也可以有多个,有多个时逗号隔开即可,也可以写成数组的形式。
- 如果使用的是连接池,可缺省第一个参数数据库连接。
- QueryRunner并非像名字中的query一样只能用于查询,QueryRunner提供的insert()方法不常用、不方便,插入也要用update()。
查询
1 //查询,结果集中只有一条记录的情况
2 String sql = "select * from student_tb where id=?";
3 BeanHandler<Student> studentBeanHandler = new BeanHandler<>(Student.class); //<>中指定目标类型,()中指定目标类型的class
4 Student student = queryRunner.query(connection, sql, studentBeanHandler,1); //执行查询,,返回的就是目标类型,不必强转
5 System.out.println(student); //可通过getter()方法获取属性值(对应表中的字段值)
1 //查询,结果集中有多条记录的情况
2 String sql = "select * from student_tb";
3 BeanListHandler<Student> studentBeanListHandler = new BeanListHandler<>(Student.class); //要用List
4 List<Student> list = queryRunner.query(connection, sql, studentBeanListHandler); //返回值的类型是List<目标JavaBean>
5 //遍历这个list就是遍历结果集
增、删、改
1 //插入
2 String sql = "insert into student_tb (name,age,score) values (?,?,?)";
3 //queryRunner.update(connection, sql, "曹操",20,90); //返回值是int,受影响的记录数
4 Object[] values = {"曹操",20,90};
5 queryRunner.update(connection, sql,values ); //?部分的参数值也可以写成数组形式
增、删、改的用法都差不多,不再一一列举。
批量操作
语法:QueryRunner对象.batch(数据库连接,sql语句,Object[][]) ;
最后一个参数是二维数组,一行对应一个sql语句?部分的参数值。
如果使用的是连接池,可缺省第一个参数数据库连接。
1 //批量插入
2 String sql = "insert into student_tb (name,age,score) values (?,?,?)";
3 Object[][] values = {{"曹操", 20, 90}, {"刘备", 20, 90}, {"孙权", 18, 88}};
4 queryRunner.batch(connection, sql,values); //批量执行,返回的是int[],一个值对应一个sql语句影响的记录数
DbUtils的批量操作是批量执行相似的sql语句(只有?部分的值不同)。
Hibernate也是将结果集中的记录映射为实体对象,相比之下,DbUtils体积极小(只有一个jar包),没有hql一样复杂的操作,操作十分简便。
- Java--JavaWeb使用commons-dbutils简化数据库操作
- 细谈浅析Mysql在Java项目中使用C3P0包和DBUtils对数据库的操作
- 常用代码备忘录(封装 Apache Commons 的 DbUtils 实现的数据库操作工具类)-DBUtil.java
- java学习笔记—第三方操作数据库包专门接收DataSource-dbutils (30)
- Java -- 数据库 多表操作,1对多,多对多,1对1。 基于dbutils框架
- java--DBUtils数据库操作工具包
- Java数据库的操作——DBUtils工具类结果集处理的方式有几种?
- Java -- 数据库 多表操作,1对多,多对多,1对1。 基于dbutils框架
- 【java基础:JDBC】采用DBUtils工具集进行数据库的增删改操作的demostration
- java中访问数据库操作
- Java对数据库操作中,PrepareStatement的Statement的区别
- JAVA操作数据库方式与设计模式应用
- 详解JAVA数据库基本操作
- JAVA操作数据库总结之组件篇-Hibernate
- Java 中以DataGrid形式显示数据库查询结果和相关JTable操作程序
- JAVA:数据库操作封装(1)
- Java数据库基本操作
- 利用Java存储过程简化数据库操作
- java数据库操作
- 利用Java存储过程简化数据库操作