Apache-DBUtils簡介
commons-dbutils 是 Apache 組織提供的一個開源 JDBC工具類庫,它是對JDBC的簡單封裝,學習成本極低, 并且使用dbutils能極大簡化jdbc編碼的工作量,同時也不會影響程式的性能。
API介紹:
org.apache.commons.dbutils.QueryRunner org.apache.commons.dbutils.ResultSetHandler
工具類:org.apache.commons.dbutils.DbUtils API包說明:
主要API的使用
DbUtils
DbUtils :提供如關閉連接配接、裝載JDBC驅動程式等正常工作的工具類,裡面的所有方法都是靜态的。主要方法 如下:
public static void close(…) throws java.sql.SQLException: DbUtils類提供了三個重載的關閉方 法。這些方法檢查所提供的參數是不是NULL,如果不是的話,它們就關閉Connection、Statement和ResultSet。
public static void closeQuietly(…): 這一類方法不僅能在Connection、Statement和ResultSet為NULL情 況下避免關閉,還能隐藏一些在程式中抛出的SQLEeception。
public static void commitAndClose(Connection conn)throws SQLException: 用來送出連接配接的事務, 然後關閉連接配接
public static void commitAndCloseQuietly(Connection conn): 用來送出連接配接,然後關閉連接配接,并且在 關閉連接配接時不抛出SQL異常。
public static void rollback(Connection conn)throws SQLException:允許conn為null,因為方法内部做 了判斷
public static void rollbackAndClose(Connection conn)throws SQLException rollbackAndCloseQuietly(Connection)
public static boolean loadDriver(java.lang.String driverClassName):這一方裝載并注冊JDBC驅動程 序,如果成功就傳回true。使用該方法,你不需要捕捉這個異常ClassNotFoundException。
QueryRunner類
該類簡單化了SQL查詢,它與ResultSetHandler組合在一起使用可以完成大部分的資料庫操作,能夠大大減少 編碼量。
QueryRunner類提供了兩個構造器: 預設的構造器 需要一個 javax.sql.DataSource 來作參數的構造器
QueryRunner類的主要方法: 更新
public int update(Connection conn, String sql, Object... params) throws SQLException:用來執行 一個更新(插入、更新或删除)操作。
......
插入
public T insert(Connection conn,String sql,ResultSetHandler rsh, Object... params) throws SQLException:隻支援INSERT語句,其中 rsh - The handler used to create the result object from the ResultSet of auto-generated keys. 傳回值: An object generated by the handler.即自動生成的 鍵值
....
批處理
public int[] batch(Connection conn,String sql,Object[][] params)throws SQLException: INSERT, UPDATE, or DELETE語句
public T insertBatch(Connection conn,String sql,ResultSetHandler rsh,Object[][] params)throws SQLException:隻支援INSERT語句
.....
查詢
public Object query(Connection conn, String sql, ResultSetHandler rsh,Object... params) throws SQLException:執行一個查詢操作,在這個查詢中,對象數組中的每個元素值被用來作為查詢語句 的置換參數。該方法會自行處理 PreparedStatement 和 ResultSet 的建立和關閉。
測試
// 測試添加
@Test
public void testInsert() throws Exception {
QueryRunner runner = new QueryRunner();
Connection conn = JDBCUtils.getConnection3();
String sql = "insert into customers(name,email,birth)values(?,?,?)";
int count = runner.update(conn, sql, "何成飛", "[email protected]", "1992-09-08");
System.out.println("添加了" + count + "條記錄");
JDBCUtils.closeResource(conn, null);
}
// 測試删除
@Test
public void testDelete() throws Exception {
QueryRunner runner = new QueryRunner();
Connection conn = JDBCUtils.getConnection3();
String sql = "delete from customers where id < ?";
int count = runner.update(conn, sql,3);
System.out.println("删除了" + count + "條記錄");
JDBCUtils.closeResource(conn, null);
}
ResultSetHandler接口及實作類
該接口用于處理 java.sql.ResultSet,将資料按要求轉換為另一種形式。
ResultSetHandler 接口提供了一個單獨的方法:Object handle (java.sql.ResultSet .rs)。 接口的主要實作類:
ArrayHandler:把結果集中的第一行資料轉成對象數組。
ArrayListHandler:把結果集中的每一行資料都轉成一個數組,再存放到List中。
BeanHandler:将結果集中的第一行資料封裝到一個對應的JavaBean執行個體中。
BeanListHandler:将結果集中的每一行資料都封裝到一個對應的JavaBean執行個體中,存放到List裡。
ColumnListHandler:将結果集中某一列的資料存放到List中。
KeyedHandler(name):将結果集中的每一行資料都封裝到一個Map裡,再把這些map再存到一個map
測試
/*
* 測試查詢:查詢一條記錄
*
* 使用ResultSetHandler的實作類:BeanHandler
*/
@Test
public void testQueryInstance() throws Exception{
QueryRunner runner = new QueryRunner();
Connection conn = JDBCUtils.getConnection3();
String sql = "select id,name,email,birth from customers where id = ?";
//
BeanHandler<Customer> handler = new BeanHandler<>(Customer.class);
Customer customer = runner.query(conn, sql, handler, 23);
System.out.println(customer);
JDBCUtils.closeResource(conn, null);
}
/*
* 測試查詢:查詢多條記錄構成的集合
*
* 使用ResultSetHandler的實作類:BeanListHandler
*/
@Test
public void testQueryList() throws Exception{
QueryRunner runner = new QueryRunner();
Connection conn = JDBCUtils.getConnection3();
String sql = "select id,name,email,birth from customers where id < ?";
//
BeanListHandler<Customer> handler = new BeanListHandler<>(Customer.class);
List<Customer> list = runner.query(conn, sql, handler, 23);
list.forEach(System.out::println);
JDBCUtils.closeResource(conn, null);
}
/*
* 自定義ResultSetHandler的實作類
*/
@Test
public void testQueryInstance1() throws Exception{
QueryRunner runner = new QueryRunner();
Connection conn = JDBCUtils.getConnection3();
String sql = "select id,name,email,birth from customers where id = ?";
ResultSetHandler<Customer> handler = new ResultSetHandler<Customer>() {
@Override
public Customer handle(ResultSet rs) throws SQLException {
System.out.println("handle");
// return new Customer(1,"Tom","[email protected]",new Date(123323432L));
if(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
Date birth = rs.getDate("birth");
return new Customer(id, name, email, birth);
}
return null;
}
};
Customer customer = runner.query(conn, sql, handler, 23);
System.out.println(customer);
JDBCUtils.closeResource(conn, null);
}
/*
* 如何查詢類似于最大的,最小的,平均的,總和,個數相關的資料,
* 使用ScalarHandler
*
*/
@Test
public void testQueryValue() throws Exception{
QueryRunner runner = new QueryRunner();
Connection conn = JDBCUtils.getConnection3();
//測試一:
// String sql = "select count(*) from customers where id < ?";
// ScalarHandler handler = new ScalarHandler();
// long count = (long) runner.query(conn, sql, handler, 20);
// System.out.println(count);
//測試二:
String sql = "select max(birth) from customers";
ScalarHandler handler = new ScalarHandler();
Date birth = (Date) runner.query(conn, sql, handler);
System.out.println(birth);
JDBCUtils.closeResource(conn, null);
}