qidao123.com技术社区-IT企服评测·应用市场
标题:
深入 Apache DBUtils:--效果集ResultSet转换为多种情势 简化 JDBC 编程的利器
[打印本页]
作者:
西河刘卡车医
时间:
2025-4-7 23:12
标题:
深入 Apache DBUtils:--效果集ResultSet转换为多种情势 简化 JDBC 编程的利器
在 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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4