DbUtils(一) 結果集概覽


      記錄自己對DbUtils的學習和了解

      我感覺Dbutils用的最多的就是對查詢結果集的處理,就以這個開始了解Dbutils庫。

      查看源代碼發現結果集的轉換主要用於query,insert,insertBatch方法。

// 僅僅列出QueryRunner類的相關代碼,其他略過
//-----------源碼1 query方法 ------------------
    stmt = this.prepareStatement(conn, sql);
    this.fillStatement(stmt, params);
    rs = this.wrap(stmt.executeQuery());
    result = rsh.handle(rs); // 處理結果集

//-----------源碼2 insert方法 ------------------
    stmt = conn.prepareStatement(sql, tatement.RETURN_GENERATED_KEYS);
    this.fillStatement(stmt, params);
    stmt.executeUpdate();
    ResultSet resultSet = stmt.getGeneratedKeys();
    generatedKeys = rsh.handle(resultSet); // 處理結果集

//-----------源碼3 insertBatch方法 ------------------
    ResultSet rs = stmt.getGeneratedKeys();
    generatedKeys = rsh.handle(rs); // 處理結果集

      對ResultSet的轉換主要圍繞兩個接口展開(ResultSetHandler<T> RowProcessor)。

      1、ResultSetHandler<T> ,關系圖如下:

接口 ResultSetHandler 及其實現類

      接口 ResultSetHandler 只有一個需要實現的方法 handle(ResultSet rs),我的理解這個方法是處理結果集的一個入口,每個結果集轉換類都在自己的 handle 方法中處理自己的事情,這個可從前面的源碼1、2、3中看出來,都是調用實現類的handle方法,再返回結果。

      ResultSetHandler  的實現類(結果集轉換類)在 handle 方法中實現對結果集的處理,大部分會涉及到另一個接口 RowProcessor 及其實現類 BasicRowProcessor

      2、RowProcessor,關系圖如下:

RowProcessor

      RowProcessor 接口有4個需要實現的方法,具體用途可以很直觀的從方法名中看出來。這幾個方法都在結果轉換類的 handle 方法中調用。需要注意如果需要將結果集轉換為Bean,那么還會涉及到一個類 BeanProcessor 的使用。

      3、ResultSetHandler 和 RowProcessor 的關系

       diagram2

      圖雖然有點亂,湊合看也能看清楚。大部分的結果集都持有一個 RowProcessor 接口的引用。需要注意的是 ArrayHandler 這個類,因為其他類 RowProcessor 的引用都是從這個類獲取的,這個類建立了 RowProcessor 實現類 BasicRowProcessor 的對象。

      需要注意其中的3個抽象類(AbstractKeyedHandler、AbstractListHandler、BaseResultSetHandler),它們的派生類才是可以使用的結果轉換類。根據文檔的說明,如果官方提供的這些轉換類都不能滿足你的要求,可以通過繼承 BaseResultSetHandler 實現自己的結果集轉換類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM