Java DBUtils工具类库的用法(附带实例)
Apache 组织提供的一个开源 JDBC 工具类库“commons-dbutils”,它是对 JDBC 的简单封装,学习成本极低,并且使用 DBUtils 工具能极大简化 JDBC 编码的工作量,同时也不会影响程序的性能。
其中 DBUtils 类库中有一个重要的类,即 QueryRunner 类,它封装了 SQL 的执行,可以实现增删改查和批处理等操作,并且是线程安全的。
我们需要掌握 QueryRunner 类的两个方法:update() 和 query() 方法。对于增删改操作使用 update() 方法,而查询操作使用 query() 方法。
下面,在 chapter07_JdbcTest 项目中引入“commons-dbutils-1.4.jar”,如下图所示,演示 DBUtils 工具的使用,此处只介绍最基本的增删改查操作。

图 1 引入“commons-dbutils-1.4.jar”
新建 dbutils 目录,在该目录下创建 InsertTest 类,实现向数据库新增数据操作,示例代码如下:
同理,在 dbutils 目录下创建 UpdateTest 类,实现修改数据操作,关键代码如下:
在 dbutils 目录下创建 DeleteTest 类,实现删除数据操作,关键代码如下:
查询数据比较复杂,需要使用 query() 方法,并且 DBUtils 工具可以将查询结果直接映射到实体类中,DBUtils 为我们提供了丰富的结果集处理器,接下来为大家演示常用的三种结果集处理器:
首先创建 User 实体类,要求该实体类的属性名与 users 表的列名保持一致,示例代码如下:
如果 sql 语句查询结果确定只有一条数据,则可以使用 BeanHandler,示例代码如下:
如果 sql 语句查询结果有多条数据,则可以使用 BeanListHandler,关键代码如下:
如果 sql 语句查询结果只有一个值,则可以使用 ScalarHandler,关键代码如下:
其中 DBUtils 类库中有一个重要的类,即 QueryRunner 类,它封装了 SQL 的执行,可以实现增删改查和批处理等操作,并且是线程安全的。
我们需要掌握 QueryRunner 类的两个方法:update() 和 query() 方法。对于增删改操作使用 update() 方法,而查询操作使用 query() 方法。
下面,在 chapter07_JdbcTest 项目中引入“commons-dbutils-1.4.jar”,如下图所示,演示 DBUtils 工具的使用,此处只介绍最基本的增删改查操作。

图 1 引入“commons-dbutils-1.4.jar”
新建 dbutils 目录,在该目录下创建 InsertTest 类,实现向数据库新增数据操作,示例代码如下:
package com.atguigu.dbutils; //省略import语句 public class InsertTest { public static void main(String[] args) throws Exception { // 1. 创建 QueryRunner 对象 QueryRunner runner = new QueryRunner(); // 2. 获得数据库连接 Connection connection = JDBCTools.getConnection(); // 3. 进行增删改操作,增删改操作逐一进行测试即可 // 3.1 新增操作 String insertSql = "insert into users(username,password,email) values(?,?,?)"; /* * update()方法的参数介绍: * Connection connection 表示数据库连接 * String sql 表示 sql 语句 * Object... params 表示 sql 语句占位符位置的参数 * 要求和之前一样,顺序和个数要保持一致 */ int len = runner.update(connection, insertSql, "xiaoshang", "atguigu", "xiaoshang@atguigu.com"); System.out.println(len > 0 ? "新增成功" : "新增失败"); // 4. 释放资源 JDBCTools.freeConnection(); } }运行代码后,查看控制台发现新增成功。
同理,在 dbutils 目录下创建 UpdateTest 类,实现修改数据操作,关键代码如下:
// 修改操作 String updateSql = "update users set username=?,password=?,email=? where id=?"; int len = runner.update( connection, updateSql, "atguigu", "123456", "xiaoshang@atguigu.cn", 1); System.out.println(len > 0 ? "修改成功" : "修改失败");
在 dbutils 目录下创建 DeleteTest 类,实现删除数据操作,关键代码如下:
// 删除操作 String deleteSql = "delete from users where id=?"; int len = runner.update(connection, deleteSql, 1); System.out.println(len > 0 ? "删除成功" : "删除失败");
查询数据比较复杂,需要使用 query() 方法,并且 DBUtils 工具可以将查询结果直接映射到实体类中,DBUtils 为我们提供了丰富的结果集处理器,接下来为大家演示常用的三种结果集处理器:
- BeanHandler:将结果集中的第一行数据封装到一个对应的 JavaBean 实例中;
- BeanListHandler:将结果集中的每一行数据都封装到一个对应的 JavaBean 实例中,存放到 List 里;
- ScalarHandler:查询单个值对象。
首先创建 User 实体类,要求该实体类的属性名与 users 表的列名保持一致,示例代码如下:
package com.atguigu.bean; public class User { private Integer id; // 用户 ID private String username; // 用户姓名 private String password; // 用户密码 private String email; // 用户邮箱 // get, set, toString 方法省略 }创建 QueryTest 类,分别测试以上三种不同的查询结果。
如果 sql 语句查询结果确定只有一条数据,则可以使用 BeanHandler,示例代码如下:
package com.atguigu.dbutils; //省略import语句 public class QueryTest { public static void main(String[] args) throws Exception { // 1. 创建 QueryRunner 对象 QueryRunner runner = new QueryRunner(); // 2. 获得数据库连接 Connection connection = JDBCTools.getConnection(); // 3. 查询情况 // 3.1 查询单条结果 String sql = "select * from users where id=?"; /* * new BeanHandler<User>(User.class) 单条结果的处理器 * 泛型设置为 User * 实参设置 User.class 底层使用反射进行映射 * 功能:将 sql 语句的查询结果映射到一个 User 对象上 */ User user = runner.query(connection, sql, new BeanHandler<User>(User.class), 1); System.out.println("user = " + user); // 4. 释放资源 JDBCTools.freeConnection(); } }
如果 sql 语句查询结果有多条数据,则可以使用 BeanListHandler,关键代码如下:
// 查询多条结果 String sql = "select * from users"; /* * new BeanListHandler<User>(User.class) 多条结果的处理器 * 泛型设置为 User * 实参设置 User.class 底层使用反射进行映射 * 功能:将 sql 语句的每一条查询结果映射到一个 User 对象上, * 最终采用 List 集合存储这些 User 对象 */ List<User> userList = runner.query(connection, sql, new BeanListHandler<User>(User.class)); userList.stream().forEach(System.out::println);
如果 sql 语句查询结果只有一个值,则可以使用 ScalarHandler,关键代码如下:
// 查询单个值结果 String sql = "select count(*) from users"; /* * new ScalarHandler<Long>() 一个值的结果处理器 * 泛型设置为 Long, sql 语句查询结果值的数据类型 * 功能:将 sql 语句的查询结果赋值到 Long 类型上 */ Long count = runner.query(connection, sql, new ScalarHandler<Long>()); System.out.println("count = " + count);