DBUtils
DbUtils介紹
DbUtils庫(kù)是一套小巧的用來(lái)簡(jiǎn)化 JDBC 調(diào)用的庫(kù)。JDBC源代碼庫(kù)單調(diào)且易出錯(cuò),所以DBUtils 類抽象出所有簡(jiǎn)單的任務(wù),讓你更專注于使用JDBC做Query和Update的工作。
DbUtils的優(yōu)勢(shì):
Some of the advantages of using DbUtils are:
不會(huì)資源泄露。更正JDBC代碼并不困難,但是卻非常耗時(shí)且單調(diào)。這通常會(huì)造成難以追蹤的Connection泄露。
清爽整潔的代碼。訪問(wèn)數(shù)據(jù)庫(kù)的代碼會(huì)大量的減少。剩下的代碼更簡(jiǎn)介的表達(dá)了你的意圖。
JavaBean屬性自動(dòng)從ResultSet中填充值。不用手動(dòng)調(diào)用setXxx為屬性賦值。
在使用JDBC訪問(wèn)數(shù)據(jù)庫(kù)是,有大量重復(fù)的代碼(注冊(cè)驅(qū)動(dòng),獲取連接,訪問(wèn)數(shù)據(jù)庫(kù),處理結(jié)果集,釋放資源等)DbUtils抽象并封裝了這些操作,方便開發(fā)人員DAO操作。
整個(gè)dbutils總共才3個(gè)包:
-
包org.apache.commons.dbutils
接口摘要
ResultSetHandler 將ResultSet轉(zhuǎn)換為別的對(duì)象的工具。
RowProcessor 將ResultSet行轉(zhuǎn)換為別的對(duì)象的工具。類摘要
BasicRowProcessor RowProcessor接口的基本實(shí)現(xiàn)類。
BeanProcessor BeanProcessor匹配列明到Bean屬性名,并轉(zhuǎn)換結(jié)果集列到Bean對(duì)象的屬性中。
DbUtils 一個(gè)JDBC輔助工具集合。
ProxyFactory 產(chǎn)生JDBC接口的代理實(shí)現(xiàn)。
QueryLoader 屬性文件加載器,主要用于加載屬性文件中的 SQL 到內(nèi)存中。
QueryRunner 使用可插拔的策略執(zhí)行SQL查詢并處理結(jié)果集。
ResultSetIterator 包裝結(jié)果集為一個(gè)迭代器。 -
包org.apache.commons.dbutils.handlers
ResultSetHandler接口的實(shí)現(xiàn)類類摘要
AbstractListHandler 將ResultSet轉(zhuǎn)為L(zhǎng)ist的抽象類
ArrayHandler 將ResultSet轉(zhuǎn)為一個(gè)Object[]的ResultSetHandler實(shí)現(xiàn)類
ArrayListHandler 將ResultSet轉(zhuǎn)換為L(zhǎng)ist<Object[]>的ResultSetHandler實(shí)現(xiàn)類
BeanHandler 將ResultSet行轉(zhuǎn)換為一個(gè)JavaBean的ResultSetHandler實(shí)現(xiàn)類
BeanListHandler 將ResultSet轉(zhuǎn)換為L(zhǎng)ist<JavaBean>的ResultSetHandler實(shí)現(xiàn)類
ColumnListHandler 將ResultSet的一個(gè)列轉(zhuǎn)換為L(zhǎng)ist<Object>的ResultSetHandler實(shí)現(xiàn)類
KeyedHandler 將ResultSet轉(zhuǎn)換為Map<Map>的ResultSetHandler實(shí)現(xiàn)類
MapHandler 將ResultSet的首行轉(zhuǎn)換為一個(gè)Map的ResultSetHandler實(shí)現(xiàn)類
MapListHandler 將ResultSet轉(zhuǎn)換為L(zhǎng)ist<Map>的ResultSetHandler實(shí)現(xiàn)類
ScalarHandler 將ResultSet的一個(gè)列到一個(gè)對(duì)象。 -
包org.apache.commons.dbutils.wrappers
添加java.sql類中功能包裝類。類摘要
SqlNullCheckedResultSet 在每個(gè)getXXX方法上檢查SQL NULL值的ResultSet包裝類。
StringTrimmedResultSet 取出結(jié)果集中字符串左右空格的ResultSet包裝類。
DBUtils核心類
-
DbUtils:連接數(shù)據(jù)庫(kù)對(duì)象----jdbc輔助方法的集合類,線程安全
構(gòu)造方法:DbUtils(),都是static方法,可以不需要new對(duì)象
作用:控制連接,控制事務(wù),控制驅(qū)動(dòng)加載一個(gè)類。 -
QueryRunner
對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作構(gòu)造方法:
- QueryRunner()
創(chuàng)建一個(gè)與數(shù)據(jù)庫(kù)無(wú)關(guān)的QueryRunner對(duì)象,后期再操作數(shù)據(jù)庫(kù)的會(huì)后,需要手動(dòng)給一個(gè)Connection對(duì)象,它可以手動(dòng)控制事務(wù)。
Connection.setAutoCommit(false); 設(shè)置手動(dòng)管理事務(wù)
Connection.commit(); 提交事務(wù) - QueryRunner(DataSource ds)
QueryRunner(DataSource ds):創(chuàng)建一個(gè)與數(shù)據(jù)庫(kù)關(guān)聯(lián)的queryRunner對(duì)象,后期再操作數(shù)據(jù)庫(kù)的時(shí)候,不需要Connection對(duì)象,自動(dòng)管理事務(wù)。
DataSource:數(shù)據(jù)庫(kù)連接池對(duì)象。
主要使用QueryRunner的 update 和
update()增刪改操作
updata.pngquery()查詢
query.png - QueryRunner()
-
結(jié)果集ResultSetHandler<T>接口
封裝數(shù)據(jù)的策略對(duì)象------將封裝結(jié)果集中的數(shù)據(jù),轉(zhuǎn)換到另一個(gè)對(duì)象
策略:封裝數(shù)據(jù)到對(duì)象的方式(示例:將數(shù)據(jù)庫(kù)保存在User、保存到數(shù)組、保存到集合)ResultSetHandler的各個(gè)實(shí)現(xiàn)類:
ArrayHandler:把結(jié)果集中的第一行數(shù)據(jù)轉(zhuǎn)成對(duì)象數(shù)組。
ArrayListHandler:把結(jié)果集中的每一行數(shù)據(jù)都轉(zhuǎn)成一個(gè)對(duì)象數(shù)組,再存放到List中。
BeanHandler:將結(jié)果集中的第一行數(shù)據(jù)封裝到一個(gè)對(duì)應(yīng)的JavaBean實(shí)例中。
BeanListHandler:將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個(gè)對(duì)應(yīng)的JavaBean實(shí)例中,存放到List里。
MapHandler:將結(jié)果集中的第一行數(shù)據(jù)封裝到一個(gè)Map里,key是列名,value就是對(duì)應(yīng)的值。
MapListHandler:將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個(gè)Map里,然后再存放到List
ColumnListHandler:將結(jié)果集中某一列的數(shù)據(jù)存放到List中。
KeyedHandler(name):將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個(gè)Map里(List<Map>),再把這些map再存到一個(gè)map里,其key為指定的列。
ScalarHandler:將結(jié)果集第一行的某一列放到某個(gè)對(duì)象中。
實(shí)例
增刪改
QueryRunner使用無(wú)參構(gòu)造的情況,QueryRunner中沒有DataSource維護(hù)數(shù)據(jù)庫(kù)的連接,在調(diào)用方法時(shí)就要選擇傳入Connection
@Test
public void test() {
QueryRunner qr = new QueryRunner();
String sql = "insert into t_user (uname,password) values (?,?)";
try {
//返回受影響的行數(shù)
int update = qr.update(JdbcUtils.getConnetion(), sql,"leex123",123);
} catch (SQLException e) {
e.printStackTrace();
}
}
查
QueryRunner使用有參構(gòu)造,傳入DataSource,new ComboPooledDataSource()是C3P0數(shù)據(jù)庫(kù)連接池
class RSHandlerDemo {
//--7.ScalarHandler:將查詢的結(jié)果的第一行的某一列放到一個(gè)對(duì)象中;精確定位到某個(gè)值;
@Test
public void query7() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
String name=(String)runner.query("select * from t_user",new ScalarHandler(2));
System.out.println(name);
}
//--6.MapListHandler:將查詢的結(jié)果的每一行存入到一個(gè)map中,鍵為列名,值為各列值;然后再將map存入list中;
@Test
public void query6() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
List<java.util.Map<String, Object>> map=runner.query("select * from t_user",new MapListHandler());
for (java.util.Map<String, Object> map2 : map) {
System.out.print(map2.get("uid"));
System.out.print(map2.get("uname"));
System.out.print(map2.get("password"));
System.out.println();
}
}
//--5.MapHandler:將查詢的結(jié)果的第一行存入到一個(gè)map中,鍵為列名,值為各列值;
@Test
public void query5() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
HashMap<String, Object> map=(HashMap<String, Object>) runner.query("select * from t_user",new MapHandler());
System.out.print(map.get("uid"));
System.out.print(map.get("uname"));
System.out.println(map.get("password"));
}
//--4.BeanListHandler:將查詢的結(jié)果的每一行封裝到一個(gè)javabean對(duì)象中,然后再將這些對(duì)象存入list中;
@Test
public void query4() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
List<User> list=runner.query("select * from t_user",new BeanListHandler<User>(User.class));
System.out.println(list);
}
//--3.BeanHandler:將查詢的結(jié)果的第一行封裝到一份javabean對(duì)象中;
@Test
public void query3() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
User User=runner.query("select * from t_user",new BeanHandler<User>(User.class));
System.out.println(User);
}
//--2.ArrayListHandler:將查詢的結(jié)果的每一行放到一個(gè)數(shù)組中,然后再將數(shù)組放到集合中;
@Test
public void query2() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
List<Object[]> list=runner.query("select * from t_user",new ArrayListHandler());
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
}
//--1.ArrayHandler:將查詢的結(jié)果的第一行放到一個(gè)數(shù)組中
@Test
public void query1() throws SQLException{
QueryRunner runner=new QueryRunner(new ComboPooledDataSource());
Object[] array=runner.query("select * from t_user",new ArrayHandler());
System.out.println(Arrays.toString(array));
}
}