深入 Apache DBUtils:--效果集ResultSet转换为多种情势 简化 JDBC 编程的 ...

打印 上一主题 下一主题

主题 1885|帖子 1885|积分 5655

在 Java 数据库编程中,JDBC 是连接和操作数据库的标准 API。然而,直接利用 JDBC 往往需要编写大量重复代码,且容易出错。Apache DBUtils 是一个开源的 JDBC 工具库,旨在简化 JDBC 编程,提升开发效率。本文将深入探讨 Apache DBUtils 的核心特性、底层源码解读以及实际应用。
目次
1. Apache DBUtils 简介
1.1 什么是 Apache DBUtils?
1.2 核心特性
2. 核心类与接口
2.1 QueryRunner 类
2.2 ResultSetHandler 接口
3. queryRunner.query()源码解读
3.1 方法参数
3.2 方法流程
4. 实际应用
4.1 查询数据并封装为 JavaBean
4.2 apache-dbutils + druid 完成 返回的效果是单行记载(单个对象)
4.3  就可以实行相干的方法,返回单行单列 , 返回的就是Object
 4.4 //演示apache-dbutils + druid 完成 dml (update, insert ,delete)
5. 总结


1. Apache DBUtils 简介


1.1 什么是 Apache DBUtils?

Apache DBUtils 是 Apache 组织提供的一个开源 JDBC 工具类库,它封装了 JDBC 的核心操作,简化了数据库编程的复杂性。通过 DBUtils,开发者可以更专注于业务逻辑,而无需处置惩罚繁琐的资源管理和效果集处置惩罚。
1.2 核心特性



  • 线程安全:QueryRunner 类是线程安全的,实用于多线程环境。
  • 简化操作:提供了丰富的 API,支持增、删、改、查、批处置惩罚等操作。
  • 效果集处置惩罚:通过 ResultSetHandler 接口,支持将效果集转换为多种情势(如 JavaBean、Map、List 等)。
2. 核心类与接口


2.1 QueryRunner 类

QueryRunner 是 DBUtils 的核心类,封装了 SQL 的实行逻辑。它支持以下操作:


  • 查询:通过 query 方法实行查询操作。
  • 更新:通过 update 方法实行增、删、改操作。
  • 批处置惩罚:通过 batch 方法实行批处置惩罚操作。
2.2 ResultSetHandler 接口

ResultSetHandler 接口用于处置惩罚 ResultSet,将效果集转换为指定的情势。DBUtils 提供了多种实现类:


  • ArrayHandler:将效果集中的第一行数据转换为对象数组。
  • ArrayListHandler:将效果集中的每一行数据转换为对象数组,并存入 List。
  • BeanHandler:将效果集中的第一行数据封装到 JavaBean 实例中。
  • BeanListHandler:将效果集中的每一行数据封装到 JavaBean 实例中,并存入 List。
  • ColumnListHandler:将效果集中某一列的数据存入 List。
  • MapHandler:将效果集中的第一行数据封装到 Map 中。
  • MapListHandler:将效果集中的每一行数据封装到 Map 中,并存入 List。
3. queryRunner.query()源码解读

以下是 QueryRunner 类中 query 方法的源码解读:
  1. public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
  2.     if (conn == null) {
  3.         throw new SQLException("Null connection");
  4.     } else if (sql == null) {
  5.         throw new SQLException("Null SQL statement");
  6.     } else if (rsh == null) {
  7.         throw new SQLException("Null ResultSetHandler");
  8.     } else {
  9.         Statement stmt = null;
  10.         ResultSet resultSet = null;
  11.         T result = null;
  12.         try {
  13.             // 处理带参数的 SQL 语句
  14.             if (params != null && params.length > 0) {
  15.                 PreparedStatement ps = this.prepareStatement(conn, sql);
  16.                 stmt = ps;
  17.                 this.fillStatement(ps, params);  // 填充参数
  18.                 resultSet = this.wrap(ps.executeQuery());  // 执行查询
  19.             } else {
  20.                 // 处理不带参数的 SQL 语句
  21.                 stmt = conn.createStatement();
  22.                 resultSet = this.wrap(stmt.executeQuery(sql));
  23.             }
  24.             // 使用 ResultSetHandler 处理结果集
  25.             result = (T)rsh.handle(resultSet);
  26.         } catch (SQLException e) {
  27.             this.rethrow(e, sql, params);  // 重新抛出异常
  28.         } finally {
  29.             // 关闭资源
  30.             this.closeQuietly(resultSet);
  31.             this.closeQuietly(stmt);
  32.         }
  33.         return result;
  34.     }
  35. }
复制代码
3.1 方法参数



  • conn:数据库连接对象。
  • sql:SQL 查询语句。
  • rsh:ResultSetHandler 实例,用于处置惩罚效果集。
  • params:SQL 参数(可选)。
3.2 方法流程


  • 参数检查:检查 conn、sql 和 rsh 是否为 null。
  • 实行查询

    • 假如 params 不为空,利用 PreparedStatement 实行带参数的查询。
    • 否则,利用 Statement 实行不带参数的查询。

  • 处置惩罚效果集:通过 ResultSetHandler 处置惩罚 ResultSet,并返回效果。
  • 异常处置惩罚:捕获并重新抛出 SQLException。
  • 资源关闭:在 finally 块中关闭 ResultSet 和 Statement。
4. 实际应用

4.1 查询数据并封装为 JavaBean

以下是一个利用 BeanListHandler 的示例:
  1.    public void testQueryManys(){
  2.         Connection connection = JDBCutils.getConnection();
  3. //        组织sql语言
  4.         QueryRunner queryRunner = new QueryRunner();
  5. //        组织sql语言
  6.         String sql = "SELECT * FROM test";
  7. //        queryRunner.query()重点理解该获取函数
  8.         try {
  9.             List<Person_> query = queryRunner.query(connection, sql, new BeanListHandler<>(Person_.class));
  10. //(1) query 方法就是执行sql 语句,得到resultset---封装到-->ArrayList 集合中
  11. //(2) 返回集合
  12. //(3) connection: 连接
  13. //(4) sql : 执行的 sql 语句
  14. //(5) new BeanListHandler<>(Actor.class): 在将 resultset-> Actor 对象-> 封装到 ArrayList
  15. //
  16. 底层使用反射机制 去获取Actor 类的属性,然后进行封装
  17. //(6) 1 就是给 sql 语句中的? 赋值,可以有多个值,因为是可变参数Object...params
  18. //(7) 底层得到的resultset ,会在 query 关闭, 关闭PreparedStatment
  19. //            System.out.println(query);
  20.             for(Person_ person :query){
  21.                 System.out.println(person.toString()+person.getPwd().toString());
  22. //                System.out.println(person);
  23.             }
  24.         } catch (SQLException e) {
  25.             throw new RuntimeException(e);
  26.         } finally {
  27.             DruidUtils_.close(null,null,connection);
  28.         }
  29.     }
复制代码
数据结构封装:

 

4.2 apache-dbutils + druid 完成 返回的效果是单行记载(单个对象)

  1.   @Test
  2.     public void testQueryoneline(){
  3.         Connection connection = JDBCutils.getConnection();
  4.         QueryRunner queryRunner = new QueryRunner();
  5.         String sql = "SELECT * FROM test where pwd=?";
  6.         try {
  7.             Object query = queryRunner.query(connection, sql, new  BeanHandler<>(Person_.class), "男");
  8.             System.out.println(query.toString());
  9.         } catch (SQLException e) {
  10.             throw new RuntimeException(e);
  11.         } finally {
  12.             DruidUtils_.close(null,null,connection);
  13.         }
  14.     }
复制代码

4.3  返回单行单列 , 即Object

  1.   @Test
  2.     public void testQuery(){//返回单行单列 ,
  3.             Connection connection = JDBCutils.getConnection();
  4.         QueryRunner queryRunner = new QueryRunner();
  5.         String sql = "SELECT name, pwd FROM test where pwd=? ";
  6.         try {
  7.             Object query = queryRunner.query(connection,sql,new ScalarHandler<>(),"女");
  8.             System.out.println(query.getClass());
  9.         } catch (SQLException e) {
  10.             throw new RuntimeException(e);
  11.         }finally {
  12.             DruidUtils_.close(null,null,connection);
  13.         }
  14.     }
复制代码

 4.4 //演示apache-dbutils + druid 完成 dml (update, insert ,delete)

  1. @Test
  2.     public void testQueryDML(){//返回单行单列 ,
  3.         Connection connection = JDBCutils.getConnection();
  4.         QueryRunner queryRunner = new QueryRunner();
  5.         String sql = "INSERT  INTO test values (?,?) ";
  6.         try {
  7.             int affectraw = queryRunner.update(connection, sql, "lixiao", "5456");
  8.         //(1) 执行 dml 操作是 queryRunner.update()
  9.          //(2) 返回的值是受影响的行数 (affected: 受影响)
  10.             System.out.println(affectraw > 0 ? "执行成功" : "执行没有影响到表");
  11.         } catch (SQLException e) {
  12.             throw new RuntimeException(e);
  13.         }finally {
  14.             DruidUtils_.close(null,null,connection);
  15.         }
  16.     }
复制代码

5. 总结

Apache DBUtils 是一个强盛的 JDBC 工具库,通过封装 JDBC 的核心操作,简化了数据库编程的复杂性。它的核心类 QueryRunner 和 ResultSetHandler 提供了丰富的功能,支持多种数据操作和效果集处置惩罚方式。通过源码解读和实际应用示例,本文展示了 DBUtils 的核心特性和利用方法,希望能帮助您更好地理解和应用这一工具。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表