天天看點

Apache-DBUtils實作CRUD操作

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);
}