day48-JDBC和連接池04( 四 )


day48-JDBC和連接池04

文章插圖
10.5.3Apache-DBUtils
  • 基本介紹
    commons-dbutils是Apache組織提供的一個開源 JDBC工具類庫,它是對 JDBC的封裝,使用dbutils能極大簡化 JDBC編碼的工作量 。
  • DbUtils類
  1. QueryRunner類:該類封裝了SQL的執行,是線程安全的 ??梢詫崿F增、刪、改、查、批處理
  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}

推薦閱讀