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