在 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 方法的源码解读:
- public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
- if (conn == null) {
- throw new SQLException("Null connection");
- } else if (sql == null) {
- throw new SQLException("Null SQL statement");
- } else if (rsh == null) {
- throw new SQLException("Null ResultSetHandler");
- } else {
- Statement stmt = null;
- ResultSet resultSet = null;
- T result = null;
- try {
- // 处理带参数的 SQL 语句
- if (params != null && params.length > 0) {
- PreparedStatement ps = this.prepareStatement(conn, sql);
- stmt = ps;
- this.fillStatement(ps, params); // 填充参数
- resultSet = this.wrap(ps.executeQuery()); // 执行查询
- } else {
- // 处理不带参数的 SQL 语句
- stmt = conn.createStatement();
- resultSet = this.wrap(stmt.executeQuery(sql));
- }
- // 使用 ResultSetHandler 处理结果集
- result = (T)rsh.handle(resultSet);
- } catch (SQLException e) {
- this.rethrow(e, sql, params); // 重新抛出异常
- } finally {
- // 关闭资源
- this.closeQuietly(resultSet);
- this.closeQuietly(stmt);
- }
- return result;
- }
- }
复制代码 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 的示例:
- public void testQueryManys(){
- Connection connection = JDBCutils.getConnection();
- // 组织sql语言
- QueryRunner queryRunner = new QueryRunner();
- // 组织sql语言
- String sql = "SELECT * FROM test";
- // queryRunner.query()重点理解该获取函数
- try {
- List<Person_> query = queryRunner.query(connection, sql, new BeanListHandler<>(Person_.class));
- //(1) query 方法就是执行sql 语句,得到resultset---封装到-->ArrayList 集合中
- //(2) 返回集合
- //(3) connection: 连接
- //(4) sql : 执行的 sql 语句
- //(5) new BeanListHandler<>(Actor.class): 在将 resultset-> Actor 对象-> 封装到 ArrayList
- //
- 底层使用反射机制 去获取Actor 类的属性,然后进行封装
- //(6) 1 就是给 sql 语句中的? 赋值,可以有多个值,因为是可变参数Object...params
- //(7) 底层得到的resultset ,会在 query 关闭, 关闭PreparedStatment
- // System.out.println(query);
- for(Person_ person :query){
- System.out.println(person.toString()+person.getPwd().toString());
- // System.out.println(person);
- }
- } catch (SQLException e) {
- throw new RuntimeException(e);
- } finally {
- DruidUtils_.close(null,null,connection);
- }
- }
复制代码 数据结构封装:
4.2 apache-dbutils + druid 完成 返回的效果是单行记载(单个对象)
- @Test
- public void testQueryoneline(){
- Connection connection = JDBCutils.getConnection();
- QueryRunner queryRunner = new QueryRunner();
- String sql = "SELECT * FROM test where pwd=?";
- try {
- Object query = queryRunner.query(connection, sql, new BeanHandler<>(Person_.class), "男");
- System.out.println(query.toString());
- } catch (SQLException e) {
- throw new RuntimeException(e);
- } finally {
- DruidUtils_.close(null,null,connection);
- }
- }
复制代码
4.3 返回单行单列 , 即Object
- @Test
- public void testQuery(){//返回单行单列 ,
- Connection connection = JDBCutils.getConnection();
- QueryRunner queryRunner = new QueryRunner();
- String sql = "SELECT name, pwd FROM test where pwd=? ";
- try {
- Object query = queryRunner.query(connection,sql,new ScalarHandler<>(),"女");
- System.out.println(query.getClass());
- } catch (SQLException e) {
- throw new RuntimeException(e);
- }finally {
- DruidUtils_.close(null,null,connection);
- }
- }
复制代码
4.4 //演示apache-dbutils + druid 完成 dml (update, insert ,delete)
- @Test
- public void testQueryDML(){//返回单行单列 ,
- Connection connection = JDBCutils.getConnection();
- QueryRunner queryRunner = new QueryRunner();
- String sql = "INSERT INTO test values (?,?) ";
- try {
- int affectraw = queryRunner.update(connection, sql, "lixiao", "5456");
- //(1) 执行 dml 操作是 queryRunner.update()
- //(2) 返回的值是受影响的行数 (affected: 受影响)
- System.out.println(affectraw > 0 ? "执行成功" : "执行没有影响到表");
- } catch (SQLException e) {
- throw new RuntimeException(e);
- }finally {
- DruidUtils_.close(null,null,connection);
- }
- }
复制代码
5. 总结
Apache DBUtils 是一个强盛的 JDBC 工具库,通过封装 JDBC 的核心操作,简化了数据库编程的复杂性。它的核心类 QueryRunner 和 ResultSetHandler 提供了丰富的功能,支持多种数据操作和效果集处置惩罚方式。通过源码解读和实际应用示例,本文展示了 DBUtils 的核心特性和利用方法,希望能帮助您更好地理解和应用这一工具。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|