1. 程式人生 > >DBUtils工具類庫的使用

DBUtils工具類庫的使用

關於Commons-DBUtils

Commons-DBUtils是Apache組織提供的一個開源的JDBC工具類庫,它對JDBC進行了簡單的封裝,學習起來很簡單, 而且大大的簡化了工作量,關於資料庫的操作一般一兩句就可以解決問題了,並且不會影響程式的效能。

DBUtils的核心API及工具類:

1、org.apache.commons.dbutils.QueryRunner

2、org.apache.commons.dbutils.ResultSetHandler

3、org.apache.commons.dbutils.DbUtils

QueryRunner類使用

因為JDBC手寫比較麻煩,而且有非常多的重複程式碼。比如獲得連線,預編譯SQL,釋放資源等..那麼可以將這些程式碼抽取出來放到工具類中。將類似的程式碼進行抽取,大大簡化JDBC的程式設計。其主要功能用來對資料庫執行增刪改查(insert、delete、update

、select),降低了操作資料庫的難度。

query():用於執行資料庫表資訊的查詢操作;

update():用於執行資料庫表的內容的增加、修改和刪除的操作;

QueryRunner物件:核心執行類
1、在一般情況下如果執行CRUD的操作:
構造方法:QueryRunner(DataSource ds);
成員方法:
publicint update(String sql,Object… args);
publicT query(String sql,ResultSetHandler rsh,Object… args);
2、如果有事務管理的話使用另一套完成CRUD的操作
構造方法:QueryRunner();
成員方法:
publicint update(Connection conn,String sql,Object… args);

publicT query(Connection conn,String sql,ResultSetHandler rsh,Object… args);

提示:不需要進行事務管理時,可以使用有構造QueryRunner(DataSource ds),因為不進行事務管理,不需要保證拿到的Connection是同一個,只需要傳遞SQL語句和ResultSetHandler引數就可以此時是自動事務;相反,若要進行事務管理,就必須保證進行的事務拿到的是同一個Connection,否則事務管理會無效,因此必須指定Connection。

ResultSetHandler介面的實現類

DBUtils的使用之ResultSetHandler的實現類一

1、ArrayHandler:把結果集中的第一行資料轉成物件陣列

public void demo() throws SQLException{
			QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
			String sql = "select * from account where id = ?" ;
			Object[] obj = queryrunner.query(sql,ArrayHandler(),1) ;
			system.out.println(Arrays.toString(obj)) ;
		}

2、ArrayListHandler:把結果集中的每一行資料都轉成一個數組,再存放到List中

public void demo() throws SQLException{
			QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
			String sql = "select * from account" ;
			List<Object[]> list = queryrunner.query(sql,ArrayListHandler()) ;
			For(Object obj:list){
			system.out.println(Arrays.toString(obj)) ;
			}
		}

DBUtils的使用ResultSetHandler的實現類二(最常用)

1、BeanHandler:將結果集中的第一行資料封裝到一個對應的JavaBean例項中

public void demo() throws SQLException{
			QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource()) ;
			String sql = "select * from account where id = ?" ;
			Account account = queryrunner.query(sql,new BeanHandler<Account>(Account.class),1) ;
			system.out.println(account) ;
		}

2、BeanListHandler:將結果集中的每一行資料都封裝到一個對應的JavaBean例項中,存放到List裡

public void demo() throws SQLException{
			QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
			String sql = "select * from account" ;
			List<Account> list = queryrunner.query(sql,BeanListHandler<Account>(Account.class)) ;
			For(Account account:list){
			system.out.println(account) ;
			}
		}

DBUtils的使用之ResultSetHandler的實現類三

1、MapHandler:將結果集中的第一行資料封裝到一個Map裡,key是列名,value就是對應的值

public void demo() throws SQLException{
			QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
			String sql = "select * from account where id = ?" ;
			Map<String,Object> map = queryrunner.query(sql,new MapHandler(),1) ;
			system.out.println(map) ;
		}

2、MapListHandler:將結果集中的每一行資料都封裝到一個Map裡,然後再存放到List

public void demo() throws SQLException{
			QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
			String sql = "select * from account" ;
			List<Map<String,Object>>list = queryrunner.query(sql,MapListHandler()) ;
			For(Map<String,Object> map2:list){
			system.out.println(map2) ;
			}
		}

DBUtils的使用之ResultSetHandler的實現類四(不常用)

1、ColumnListHandler:將結果集中某一列的資料存放到List中

public void demo() throws SQLException{
			QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource() ;
			String sql = "select * from account" ;
			List<Object> list = queryrunner.query(sql,new ColumnListHandler("name")) ;
			for(Object obj:list){
			system.out.println(obj) ;
			}
		}

2、KeyedHandler(name):將結果集中的每一行資料都封裝到一個Map裡,再把這些map再存到一個map裡,其key為指定的key

public void deme(){
			QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource()) ;
			String sql = "select * from account" ;
			Map<Object,Map<String,Object>> map = QueryRunner.query(sql,new keyedHandler());
			for(Object key : map.keySet()){
			system.out.println(key+""+map.get(key));
			}
		}

3、ScalarHandler :將ResultSet中一條記錄的其中某一列的資料存成Object

public void demo(){
			QueryRunner queryrunner = new QueryRunner(JDBCUtils.getDataSource()) ;
			String sql = "select count(*) from account" ;
			Object obj = queryrunner.query(sql,new ScalarHandler()) ;
			system.out.println(obj) ;
		}

最後附上改寫的工具類

public class DBUtils {

	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

	// 獲取連線池中的連線
	public static Connection getConnection() throws SQLException {

		return dataSource.getConnection();

	}

	// 獲取資料來源
	public static DataSource getDataSource() {
		return dataSource;
	}

	// 釋放釋放資源
	public static void release(Statement stat, Connection con) {

		if (stat != null) {
			try {
				stat.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			stat = null;
		}
		if (con != null) {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		con = null;
	}

	// 釋放釋放資源
	public static void release(ResultSet rs, Statement stat, Connection con) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}
		release(stat, con);
	}
}