首页 > 编程笔记 > Java笔记 阅读:11

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 类,实现向数据库新增数据操作,示例代码如下:
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 为我们提供了丰富的结果集处理器,接下来为大家演示常用的三种结果集处理器:
首先创建 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);

相关文章