Apache—dbutils開源JDBC工具類庫簡介

Apache—dbutils開源JDBC工具類庫簡介

1、前言

  commons-dbutils 是 Apache 組織提供的一個開源 JDBC工具類庫,它是對JDBC的簡單封裝,學習成本極低,而且使用dbutils能極大簡化jdbc編碼的工做量,同時也不會影響程序的性能。java

  API介紹:
  ①org.apache.commons.dbutils.QueryRunner
  ②org.apache.commons.dbutils.ResultSetHandlersql

  工具類:org.apache.commons.dbutils.DbUtils數據庫

2、DbUtils類

  DbUtils :提供如關閉鏈接、裝載JDBC驅動程序等常規工做的工具類,裏面的全部方法都是靜態的。主要方法以下:apache

  ①public static void close(…) throws java.sql.SQLException: 
  DbUtils類提供了三個重載的關閉方法。這些方法檢查所提供的參數是否是NULL,若是不是的話,它們就關閉Connection、Statement和ResultSet。數組

  ②public static void closeQuietly(…): ide

  這一類方法不只能在Connection、Statement和ResultSet爲NULL狀況下避免關閉,還能
隱藏一些在程序中拋出的SQLEeception。函數

  ③public static void commitAndCloseQuietly(Connection conn):
  用來提交鏈接,而後關閉鏈接,而且在關閉鏈接時不拋出SQL異常。工具

  ④public static boolean loadDriver(java.lang.String driverClassName):性能

  這一方裝載並註冊JDBC驅動程序,若是成功就返回true。使用該方法,你不須要捕捉這個異常ClassNotFoundException。學習

3、QueryRunner類

  該類簡單化了SQL查詢,它與ResultSetHandler組合在一塊兒使用能夠完成大部分的數據庫操做,可以大大減小編碼量。

  QueryRunner類提供了兩個構造方法:
  ①默認的構造方法
  ②須要一個 javax.sql.DataSource 來做參數的構造方法。

  QueryRunner類的主要方法:

  ①public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:

  執行一個查詢操做,在這個查詢中,對象數組中的每一個元素值被用來做爲查詢語句的置換參數。該方法會自行處理 PreparedStatement 和ResultSet 的建立和關閉。

  ②public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 

  幾乎與第一種方法一樣;惟一的不一樣在於它不將數據庫鏈接提供給方法,而且它是從提供給構造方法的數據源(DataSource) 或使用的setDataSource 方法中從新得到 Connection。

  ③public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException :

  執行一個不須要置換參數的查詢操做。

  ④public int update(Connection conn, String sql, Object[] params) throws SQLException:

  用來執行一個更新(插入、更新或刪除)操做。

4、ResultSetHandler接口

  該接口用於處理 java.sql.ResultSet,將數據按要求轉換爲另外一種形式。

  ResultSetHandler 接口提供了一個單獨的方法:Object handle (java.sql.ResultSet .rs)。

  ResultSetHandler 接口的實現類:

  ①ArrayHandler:把結果集中的第一行數據轉成對象數組。
  ②ArrayListHandler:把結果集中的每一行數據都轉成一個數組,再存放到List中。
  ③BeanHandler:將結果集中的第一行數據封裝到一個對應的JavaBean實例中。
  ④BeanListHandler:將結果集中的每一行數據都封裝到一個對應的JavaBean實例中,存放到List裏。
  ⑤ColumnListHandler:將結果集中某一列的數據存放到List中。
  ⑥KeyedHandler(name):將結果集中的每一行數據都封裝到一個Map裏,再把這些map再存到一個map裏,其key爲指定的key。
  ⑦MapHandler:將結果集中的第一行數據封裝到一個Map裏,key是列名,value就是對應的值。
  ⑧MapListHandler:將結果集中的每一行數據都封裝到一個Map裏,而後再存放到List

5、代碼示例

 1 package me.jdbc.day04;  2  3 import java.io.IOException;  4 import java.sql.Connection;  5 import java.sql.Date;  6 import java.sql.ResultSet;  7 import java.sql.SQLException;  8 import java.util.ArrayList;  9 import java.util.List;  10 import java.util.Map;  11  12 import org.apache.commons.dbutils.QueryLoader;  13 import org.apache.commons.dbutils.QueryRunner;  14 import org.apache.commons.dbutils.ResultSetHandler;  15 import org.apache.commons.dbutils.handlers.BeanListHandler;  16 import org.apache.commons.dbutils.handlers.MapHandler;  17 import org.apache.commons.dbutils.handlers.MapListHandler;  18 import org.apache.commons.dbutils.handlers.ScalarHandler;  19 import org.junit.Test;  20  21 import me.jdbc.day02.Customer;  22  23 /**  24  * Apache DBUtils測試類  25  *  26  * @author Administrator  27  *  28 */  29 public class DBUtilsTest {  30  31 /**  32  * QueryLoader: 能夠用來加載存放着 SQL 語句的資源文件. 使用該類能夠把 SQL 語句外置化到一個資源文件中. 以提供更好的解耦  33  *  34  * @throws IOException  35 */  36  @Test  37 public void testQueryLoader() throws IOException {  38 // / 表明類路徑的根目錄.  39 Map<String, String> sqls = QueryLoader.instance().load("/sql.properties");  40  41 String updateSql = sqls.get("UPDATE_CUSTOMER");  42  System.out.println(updateSql);  43  }  44  45 /**  46  * 1. ResultSetHandler 的做用:  47  * QueryRunner 的 query 方法的返回值最終取決於 query 方法的ResultHandler 參數的 hanlde 方法的返回值.  48  *  49  * 2. BeanListHandler: 把結果集轉爲一個 Bean 的 List, 並返回.  50  * Bean 的類型在 建立BeanListHanlder 對象時以 Class 對象的方式傳入.  51  * 能夠適應列的別名來映射 JavaBean 的屬性名:  52  * String sql = "SELECT id, name customerName, email, birth FROM customers WHERE id = ?";  53  *  54  * BeanListHandler(Class<T> type)  55  *  56  * 3. BeanHandler: 把結果集轉爲一個 Bean, 並返回.  57  * Bean 的類型在建立 BeanHandler 對象時以 Class對象的方式傳入 BeanHandler(Class<T> type)  58  *  59  * 4. MapHandler: 把結果集轉爲一個 Map 對象, 並返回. 若結果集中有多條記錄, 僅返回 第一條記錄對應的 Map 對象.  60  * Map的鍵: 列名(而非列的別名), 值: 列的值  61  *  62  * 5. MapListHandler: 把結果集轉爲一個 Map 對象的集合, 並返回. Map 的鍵: 列名(而非列的別名), 值: 列的值  63  *  64  * 6. ScalarHandler: 能夠返回指定列的一個值或返回一個統計函數的值.  65 */  66  67  @Test  68 public void testScalarHandler() {  69 Connection connection = null;  70 QueryRunner queryRunner = new QueryRunner();  71  72 String sql = "SELECT name FROM customers WHERE id = ?";  73  74 try {  75 connection = JDBCTools.getConnection();  76 Object count = queryRunner.query(connection, sql, new ScalarHandler(), 6);  77  78  System.out.println(count);  79 } catch (Exception e) {  80  e.printStackTrace();  81 } finally {  82 JDBCTools.releaseDB(null, null, connection);  83  }  84  }  85  86  @Test  87 public void testMapListHandler() {  88 Connection connection = null;  89 QueryRunner queryRunner = new QueryRunner();  90  91 String sql = "SELECT id, name, email, birth FROM customers";  92  93 try {  94 connection = JDBCTools.getConnection();  95 List<Map<String, Object>> mapList = queryRunner.query(connection, sql, new MapListHandler());  96  97  System.out.println(mapList);  98 } catch (Exception e) {  99  e.printStackTrace(); 100 } finally { 101 JDBCTools.releaseDB(null, null, connection); 102  } 103  } 104 105  @Test 106 public void testMapHandler() { 107 Connection connection = null; 108 QueryRunner queryRunner = new QueryRunner(); 109 110 String sql = "SELECT id, name customerName, email, birth FROM customers WHERE id = ?"; 111 112 try { 113 connection = JDBCTools.getConnection(); 114 Map<String, Object> map = queryRunner.query(connection, sql, new MapHandler(), 4); 115 116  System.out.println(map); 117 } catch (Exception e) { 118  e.printStackTrace(); 119 } finally { 120 JDBCTools.releaseDB(null, null, connection); 121  } 122  } 123 124 /** 125  * 測試 ResultSetHandler 的 BeanListHandler 126  * 實現類 BeanListHandler: 把結果集轉爲一個 Bean的 List. 127  * 該 Bean 的類型在建立 BeanListHandler 對象時傳入: 128  * new BeanListHandler<>(Customer.class) 129  * 130 */ 131  @Test 132 public void testBeanListHandler() { 133 String sql = "SELECT id, name, email, birth FROM customers"; 134 135 // 1. 建立 QueryRunner 對象 136 QueryRunner queryRunner = new QueryRunner(); 137 138 Connection conn = null; 139 140 try { 141 conn = JDBCTools.getConnection(); 142 143 Object object = queryRunner.query(conn, sql, new BeanListHandler<>(Customer.class)); 144 145  System.out.println(object); 146 } catch (Exception e) { 147  e.printStackTrace(); 148 } finally { 149 JDBCTools.releaseDB(null, null, conn); 150  } 151  } 152 153 /** 154  * 測試 QueryRunner 的 query 方法 155 */ 156 @SuppressWarnings({ "unchecked", "rawtypes" }) 157  @Test 158 public void testResultSetHandler() { 159 String sql = "SELECT id, name, email, birth FROM customers"; 160 161 // 1. 建立 QueryRunner 對象 162 QueryRunner queryRunner = new QueryRunner(); 163 164 Connection conn = null; 165 166 try { 167 conn = JDBCTools.getConnection(); 168 /** 169  * 2. 調用 query 方法: ResultSetHandler 170  * 參數的做用: query 方法的返回值直接取決於ResultSetHandler 的 hanlde(ResultSet rs) 是如何實現的. 171  * 實際上, 在QueryRunner 類的 query 方法中也是調用了 ResultSetHandler 的 handle()方法做爲返回值的。 172 */ 173 Object object = queryRunner.query(conn, sql, new ResultSetHandler() { 174  @Override 175 public Object handle(ResultSet rs) throws SQLException { 176 List<Customer> customers = new ArrayList<>(); 177 178 while (rs.next()) { 179 int id = rs.getInt(1); 180 String name = rs.getString(2); 181 String email = rs.getString(3); 182 Date birth = rs.getDate(4); 183 184 Customer customer = new Customer(id, name, email, birth); 185  customers.add(customer); 186  } 187 188 return customers; 189  } 190  }); 191 192  System.out.println(object); 193 } catch (Exception e) { 194  e.printStackTrace(); 195 } finally { 196 JDBCTools.releaseDB(null, null, conn); 197  } 198 199  } 200 201 /** 202  * 測試 QueryRunner 類的 update 方法 203  * 該方法可用於 INSERT, UPDATE 和 DELETE 204 */ 205  @Test 206 public void testQueryRunnerUpdate() { 207 // 1. 建立 QueryRunner 的實現類 208 QueryRunner queryRunner = new QueryRunner(); 209 210 String sql = "DELETE FROM customers WHERE id IN (?,?)"; 211 212 Connection connection = null; 213 214 try { 215 connection = JDBCTools.getConnection(); 216 // 2. 使用其 update 方法 217 queryRunner.update(connection, sql, 12, 13); 218 } catch (Exception e) { 219  e.printStackTrace(); 220 } finally { 221 JDBCTools.releaseDB(null, null, connection); 222  } 223 224  } 225 226 }
View Code

 

若是,您對個人這篇博文有什麼疑問,歡迎評論區留言,你們互相討論學習。
若是,您認爲閱讀這篇博客讓您有些收穫,不妨點擊一下右下角的【推薦】。
若是,您但願更容易地發現個人新博客,不妨點擊一下左下角的【關注我】。
若是,您對個人博文感興趣,能夠關注個人後續博客,我是【AlbertRui】。

轉載請註明出處和連接地址,歡迎轉載,謝謝!

相關文章
相關標籤/搜索