day48-JDBC和连接池04( 四 )


day48-JDBC和连接池04

文章插图
10.5.3Apache-DBUtils
  • 基本介绍
    commons-dbutils是Apache组织提供的一个开源 JDBC工具类库,它是对 JDBC的封装,使用dbutils能极大简化 JDBC编码的工作量 。
  • DbUtils类
  1. QueryRunner类:该类封装了SQL的执行,是线程安全的 。可以实现增、删、改、查、批处理
  2. 使用QueryRunner类实现查询
  3. ResultSetHandler接口:该接口用于处理 java.sql.ResultSet , 将数据按要求转换为另一种形式
方法解释ArrayHandler将结果集中的第一行数据转成对象数组ArrayListHandler把结果集中的每一行数据都转成一个数组,再存放到List中BeanHandler将结果集中的第一行数据封装到一个对应的JavaBean实例中BeanListHandler将结果集中的每一行数据都封装到一个对应的JavaBean实例中,再存放到List中ColumnListHandler将结果集中某一列的数据存放到List中KeyedHandler(name)将结果集中的每行数据都封装到Map中,再把这些map再存放到一个map里,其key为指定的keyMapHandler将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值MapListHandler将结果集中的每一行数据都封装到一个Map里,然后再存放到List
DBUtils的jar包下载可以去官网下载
应用实例
使用DBUtils+数据库连接池(德鲁伊)方式 , 完成对表actor的crud操作
day48-JDBC和连接池04

文章插图
首先将DBUtils的jar包添加到项目的libs文件夹下面,右键选择add as library
day48-JDBC和连接池04

文章插图
Actor类详见10.5.2
DBUtils_USE:
package li.jdbc.datasource;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanListHandler;import org.junit.Test;import java.sql.Connection;import java.sql.SQLException;import java.util.List;public class DBUtils_USE {//使用Apache-DBUtils工具类 + Druid 完成对表的crud操作@Testpublic void testQueryMany() throws SQLException {//返回结果是多行的情况//1.得到连接(Druid)Connection connection = JDBCUtilsByDruid.getConnection();//2.使用DBUtils类和接口(先引入相关的jar , 加入到本地的project)//3.创建QueryRunnerQueryRunner queryRunner = new QueryRunner();//4.然后就可以执行相关的方法,返回ArrayList结果集//String sql = "Select * from actor where id >=?";//注意 :sql语句也可以查询部分的列,没有查询的属性就在actor对象中置空String sql = "Select id,name from actor where id >=?";/*** (1) query方法就是执行sql语句,得到resultSet--封装到-->Arraylist集合中* (2) 然后返回集合* (3) connection就是连接* (4) sql:执行的sql语句* (5) new BeanListHandler<>(Actor.class): 将resultSet->Actor对象->封装到ArrayList*底层使用反射机制,去获取 Actor的属性,然后进行封装* (6) 1 就是给sql语句中的?赋值,可以有多个值 , 因为是可变参数* (7) 底层得到的resultSet,会在query关闭,同时也会关闭PreparedStatement对象*/List<Actor> list =queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 1);System.out.println("输出集合的信息:");for (Actor actor : list) {System.out.print(actor);}//释放资源JDBCUtilsByDruid.close(null, null, connection);}}
day48-JDBC和连接池04

文章插图
10.5.4ApDBUtils源码分析在上述10.5.3代码中,在List<Actor> list = queryRunner.query(connection, sql, new BeanListHandler<>(Actor.class), 1);语句旁打上断点,点击debug,点击step into
day48-JDBC和连接池04

文章插图
光标跳转到如下方法:
public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh,Object... params) throws SQLException {PreparedStatement stmt = null;//定义PreparedStatement对象ResultSet rs = null;//接收返回的resultSetT result = null;//返回ArrayListtry {stmt = this.prepareStatement(conn, sql);//创建PreparedStatementthis.fillStatement(stmt, params);//对SQL语句进行?赋值rs = this.wrap(stmt.executeQuery());//执行SQL,返回resultSetresult = rsh.handle(rs);//将返回的resultSet-->封装到ArrayList中[使用反射 , 对传入的class对象进行处理]} catch (SQLException e) {this.rethrow(e, sql, params);} finally {try {close(rs);//关闭resultSet} finally {close(stmt);//关闭preparedStatement}}return result;//返回ArrayList}

推荐阅读