Java數(shù)據(jù)庫操作庫DButils類的使用方法與實例詳解
DbUtils是Javar的一個為簡化JDBC操作類庫
commons-dbutils是Apache組織提供的一個開源JDBC工具類庫,它是對JDBC的簡單封裝,學(xué)習(xí)成本極低,并且使用dbutils能極大簡化jdbc編碼的工作量,同時也不會影響程序的性能。因此dbutils成為很多不喜歡hibernate的公司的首選。
整個dbutils總共才3個包:
org.apache.commons.dbutils (該包中的類主要幫助我們更便捷的操作JDBC)
org.apache.commons.dbutils.handlers(該包中的類都是實現(xiàn)org.apache.commons.dbutils.ResultSetHandler接口的實現(xiàn)類)
org.apache.commons.dbutils.wrappers(該包中的類主要是封裝了對Sql結(jié)果集的操作)
1.DbUtils包的簡介:
1.1 org.apache.commons.dbutils 包的使用和相關(guān)類的簡介:
接口摘要:
- ResultSetHandler 將ResultSet轉(zhuǎn)換為別的對象的工具。
- RowProcessor 將ResultSet行轉(zhuǎn)換為別的對象的工具。
類摘要:
BasicRowProcessor RowProcessor接口的基本實現(xiàn)類。
BeanProcessor BeanProcessor匹配列明到Bean屬性名,并轉(zhuǎn)換結(jié)果集列到Bean對象的屬性中。
DbUtils 一個JDBC輔助工具集合。
ProxyFactory 產(chǎn)生JDBC接口的代理實現(xiàn)。
QueryLoader 屬性文件加載器,主要用于加載屬性文件中的 SQL 到內(nèi)存中。
QueryRunner 使用可插拔的策略執(zhí)行SQL查詢并處理結(jié)果集。
ResultSetIterator 包裝結(jié)果集為一個迭代器。
1.2 org.apache.commons.dbutils.handlers 的使用和相關(guān)類的簡介:
類摘要:
| 相關(guān)類 | 作用 |
|---|---|
| AbstractListHandler | 將ResultSet轉(zhuǎn)為List的抽象類 |
| ArrayHandler | 將ResultSet轉(zhuǎn)為一個Object[]的ResultSetHandler實現(xiàn)類 |
| ArrayListHandler | 將ResultSet轉(zhuǎn)換為List<Object[]>的ResultSetHandler實現(xiàn)類 |
| BeanHandler | ResultSet行轉(zhuǎn)換為一個JavaBean的ResultSetHandler實現(xiàn)類 |
| BeanListHandler | 將ResultSet轉(zhuǎn)換為List<JavaBean>的ResultSetHandler實現(xiàn)類 |
| ColumnListHandler | 將ResultSet的一個列轉(zhuǎn)換為List<Object>的ResultSetHandler實現(xiàn)類 |
| KeyedHandler | 將ResultSet轉(zhuǎn)換為Map<Map>的ResultSetHandler實現(xiàn)類 |
| MapHandler | 將ResultSet的首行轉(zhuǎn)換為一個Map的ResultSetHandler實現(xiàn)類 |
| MapListHandler | 將ResultSet轉(zhuǎn)換為List<Map>的ResultSetHandler實現(xiàn)類 |
| ScalarHandler | 將ResultSet的一個列到一個對象。 |
1.3 org.apache.commons.dbutils.wrappers包的使用
SqlNullCheckedResultSet 在每個getXXX方法上檢查SQL NULL值的ResultSet包裝類。
StringTrimmedResultSet 取出結(jié)果集中字符串左右空格的ResultSet包裝類。
2.使用DBUtils(兩類一接口)
只是使用的話,只看兩個類(DbUtils 和QueryRunner)和一個接口(ResultSethandler)就可以了。
2.1 DbUtils類:
DbUtils是一個為做一些諸如關(guān)閉連接、裝載JDBC驅(qū)動程序之類的常規(guī)工作提供有用方法的類,它里面所有的方法都是靜態(tài)的。
這個類里的重要方法有:
(1)close():
DbUtils類提供了三個重載的關(guān)閉方法。這些方法檢查所提供的參數(shù)是不是NULL,
如果不是的話,它們就關(guān)閉連接、聲明和結(jié)果集(ResultSet)。
(2)CloseQuietly:
CloseQuietly這一方法不僅能在連接、聲明或者結(jié)果集(ResultSet)為NULL情況下避免關(guān)閉,還能隱藏一些在程序中拋出的SQLEeception。如果你不想捕捉這些異常的話,這對你是非常有用的。在重載CloseQuietly方法時,特別有用的一個方法closeQuietly(Connection conn,Statement stmt,ResultSet rs),這是因為在大多數(shù)情況下,連接、聲明和結(jié)果集(ResultSet)是你要用的三樣?xùn)|西,而且在最后的塊你必須關(guān)閉它們。使用這一方法,你最后的塊就可以只需要調(diào)用這一方法即可。
(3)CommitAndCloseQuietly(Connection conn):
這一方法用來提交連接,然后關(guān)閉連接,并且在關(guān)閉連接時不向上拋出在關(guān)閉時發(fā)生的一些SQL異常,LoadDriver(String driveClassName):這一方法裝載并注冊JDBC驅(qū)動程序,如果成功就返回TRUE。使用這種方法,你不需要去捕捉這個異常ClassNotFoundException。使用loadDrive方法,編碼就變得更容易理解,你也就得到了一個很好的Boolean返回值,這個返回值會告訴你驅(qū)動類是不是已經(jīng)加載成功了。
2.2 QureryRunner類:
該類簡單化了SQL查詢,它與ResultSetHandler組合在一起使用可以完成大部分的數(shù)據(jù)庫操作,能夠大大減少編碼量。
QueryRunner類提供了兩個構(gòu)造方法:
(1)一個是一個空構(gòu)造器;
(2)另一個則拿一個 javax.sql.DataSource 來作為參數(shù)。因此,在你不用為一個方法提供一個數(shù)據(jù)庫連接來作為參數(shù)的情況下,提供給構(gòu)造器的數(shù)據(jù)源(DataSource) 被用來獲得一個新的連接并將繼續(xù)進行下去。
主要的方法:
- public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:執(zhí)行一個查詢操作,在這個查詢中,對象數(shù)組中的每個元素值被用來作為查詢語句的置換參數(shù)。該方法會自行處理 PreparedStatement 和 ResultSet 的創(chuàng)建和關(guān)閉。
- public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 幾乎與第一種方法一樣;唯一的不同在于它不將數(shù)據(jù)庫連接提供給方法,并且它是從提供給構(gòu)造方法的數(shù)據(jù)源(DataSource) 或使用的setDataSource 方法中重新獲得 Connection。
- public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException :執(zhí)行一個不需要置換參數(shù)的查詢操作。
- public int update(Connection conn, String sql, Object[] params) throws SQLException:用來執(zhí)行一個更新(插入、更新或刪除)操作,返回的是受語句影響的行數(shù)
- public int update(Connection conn, String sql) throws SQLException:用來執(zhí)行一個不需要置換參數(shù)的更新操作, 返回的是受語句影響的行數(shù)
2.3:ResultSetHandler接口:
該接口用于處理Java.sql.ResultSet,將數(shù)據(jù)按要求轉(zhuǎn)換為另一種形式。ResultSetHandler接口提供了一個單獨的方法:Object handle (java.sql.ResultSet rs)。因此任何ResultSetHandler 的執(zhí)行需要一個結(jié)果集(ResultSet)作為參數(shù)傳入,然后才能處理這個結(jié)果集,再返回一個對象。
因為返回類型是java.lang.Object,所以除了不能返回一個原始的Java類型之外,其它的返回類型并沒有什么限制。如果你發(fā)現(xiàn)這七個執(zhí)行程序中沒有任何一個提供了你想要的服務(wù),你可以自己寫執(zhí)行程序并使用它。這一組件提供了ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, MapHandler, MapListHandler, and ScalarHandler等執(zhí)行程序。其方法如下:
| 相關(guān)類 | 作用 |
|---|---|
| AbstractListHandler | 將ResultSet轉(zhuǎn)為List的抽象類 |
| ArrayHandler | 將ResultSet轉(zhuǎn)為一個Object[]的ResultSetHandler實現(xiàn)類 |
| ArrayListHandler | 將ResultSet轉(zhuǎn)換為List<Object[]>的ResultSetHandler實現(xiàn)類 |
| BeanHandler | ResultSet行轉(zhuǎn)換為一個JavaBean的ResultSetHandler實現(xiàn)類 |
| BeanListHandler | 將ResultSet轉(zhuǎn)換為List<JavaBean>的ResultSetHandler實現(xiàn)類 |
| ColumnListHandler | 將ResultSet的一個列轉(zhuǎn)換為List<Object>的ResultSetHandler實現(xiàn)類 |
| KeyedHandler | 將ResultSet轉(zhuǎn)換為Map<Map>的ResultSetHandler實現(xiàn)類 |
| MapHandler | 將ResultSet的首行轉(zhuǎn)換為一個Map的ResultSetHandler實現(xiàn)類 |
| MapListHandler | 將ResultSet轉(zhuǎn)換為List<Map>的ResultSetHandler實現(xiàn)類 |
| ScalarHandler | 將ResultSet的一個列到一個對象。 |
3.代碼實戰(zhàn):
使用遵從以下步驟:
1.加載JDBC驅(qū)動程序類,并用DriverManager來得到一個數(shù)據(jù)庫連接conn。
2.實例化 QueryRunner,得到實例化對象qRunner。
3. qRunner.update()方法,執(zhí)行增改刪的sql命令, qRunner.query()方法,得到結(jié)果集。
首先生成以下數(shù)據(jù)庫表:
create table stuInfo ( stuNo int primary key identity (1,1),--學(xué)號 stuName nvarchar(10) not null,--學(xué)生姓名 stuSex nvarchar(2) not null,--學(xué)生性別 stuAge int not null,--學(xué)生年齡 stuSeat int not null,--學(xué)生座位 stuAddress nvarchar(20) --學(xué)生住址 )
(1)完成CRUD的操作:
public class QueryRunnerTest {
public static void main(String[] args) {
QueryRunnerTest test = new QueryRunnerTest();
test.add();
test.delete();
test.update();
test.find();
test.getAll();
}
//靜態(tài)方法獲取數(shù)據(jù)庫鏈接對象:
private static Connection getConnection() {
Connection conn = null;
try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;Database=student", "sa", "sasa");
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(conn);
return conn;
}
//添加方法
public void add () {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql = "insert into stuInfo (stuName,stuSex,stuAge,stuSeat,stuAddress) values (?,?,?,?,?)";
Object param[] = {"張良","男",20,11,"韓國"};
int i;
try {
i = qr.update(conn, sql, param); //i是受操作影響的行數(shù);
System.out.println("添加成功:"+i);
DbUtils.closeQuietly(conn); //關(guān)閉鏈接;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//刪除方法
public void delete() {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql ="delete from stuInfo where stuNo=?";
try {
int i = qr.update(conn, sql, 7); i是受操作影響的行數(shù);
System.out.println("刪除成功:"+i);
DbUtils.closeQuietly(conn); //關(guān)閉鏈接;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//修改方法
public void update() {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql = "update stuInfo set stuName=? where stuNo=?";
Object params[] = {"胡歌",3};
try {
int i = qr.update(conn, sql, params);
System.out.println("修改成功:"+i); // i是受操作影響的行數(shù);
DbUtils.closeQuietly(conn); //關(guān)閉鏈接;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//查詢方法
public void find() {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql = "select * from stuInfo where stuNo=?";
Object params[] = {5};
try {
StuInfo stuInfo = (StuInfo)qr.query(conn, sql, new BeanHandler<StuInfo>(StuInfo.class), params);
System.out.println("查詢成功:"+stuInfo);
DbUtils.closeQuietly(conn); //關(guān)閉鏈接;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//查詢所有
public void getAll() {
Connection conn = getConnection();
QueryRunner qr = new QueryRunner();
String sql ="select * from stuInfo";
ArrayList<StuInfo> list;
try {
list = (ArrayList<StuInfo>) qr.query(conn, sql, new BeanListHandler<StuInfo>(StuInfo.class));
for (StuInfo stuInfo : list) {
System.out.println(stuInfo);
}
DbUtils.closeQuietly(conn); //關(guān)閉鏈接;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(2)測試dbutils各種類型的處理器:
(1)ArrayHandler:把結(jié)果集中的第一行數(shù)據(jù)轉(zhuǎn)成對象數(shù)組。測試代碼如下:
public class Demo2 {
@Test
public void test1() throws SQLException {
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from users";
Object[] result = runner.query(sql, new ArrayHandler());
System.out.println(result[0]);
System.out.println(result[1]);
}
}
(2)ArrayListHandler:把結(jié)果集中的每一行數(shù)據(jù)都轉(zhuǎn)成一個數(shù)組,再存放到List中。測試代碼如下:
public class Demo2 {
@Test
public void test2() throws SQLException {
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from users";
List list = runner.query(sql, new ArrayListHandler());
System.out.println(list);
}
}
(3)ColumnListHandler:將結(jié)果集中某一列的數(shù)據(jù)存放到List中。測試代碼如下:
public class Demo2 {
@Test
public void test3() throws SQLException {
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from users";
List list = (List) runner.query(sql, new ColumnListHandler("name"));
System.out.println(list);
}
}
(4)KeyedHandler(name):將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個Map里,再把這些map再存到一個map里,其key為指定的key:
這話聽起來有些繞口,但我用一張圖來解釋就很明白了。

public class Demo2 {
@Test
public void test4() throws SQLException {
QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
String sql = "select * from users";
Map<Integer, Map<String, Object>> map = (Map<Integer, Map<String, Object>>) runner.query(sql, new KeyedHandler("id"));
for (Map.Entry<Integer, Map<String, Object>> me : map.entrySet()) {
int id = me.getKey();
for (Map.Entry<String, Object> entry : me.getValue().entrySet()) {
String name = entry.getKey();
Object value = entry.getValue();
System.out.println(name+"="+value);
}
}
}
}
至此本文介紹了Java數(shù)據(jù)庫操作庫DButils類的使用方法與實例更多相關(guān)鏈接請查看下面的相關(guān)鏈接
相關(guān)文章
新版idea創(chuàng)建spring boot項目的詳細教程
這篇文章給大家介紹了新版idea創(chuàng)建spring boot項目的詳細教程,本教程對新手小白友好,若根據(jù)教程創(chuàng)建出現(xiàn)問題導(dǎo)致失敗可下載我提供的源碼,在文章最后,本教程較新,文中通過圖文給大家介紹的非常詳細,感興趣的朋友可以參考下2024-01-01
Java實現(xiàn)利用廣度優(yōu)先遍歷(BFS)計算最短路徑的方法
這篇文章主要介紹了Java實現(xiàn)利用廣度優(yōu)先遍歷(BFS)計算最短路徑的方法,實例分析了廣度優(yōu)先遍歷算法的原理與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04
使用Java構(gòu)造和解析Json數(shù)據(jù)的兩種方法(詳解二)
這篇文章主要介紹了使用Java構(gòu)造和解析Json數(shù)據(jù)的兩種方法(詳解二)的相關(guān)資料,需要的朋友可以參考下2016-03-03
SpringBoot整合POI導(dǎo)出通用Excel的方法示例
這篇文章主要介紹了SpringBoot整合POI導(dǎo)出通用Excel的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
spring項目自定義全局響應(yīng)處理器統(tǒng)一處理響應(yīng)結(jié)果的實現(xiàn)步驟
本文詳細描述了如何通過@ControllerAdvice和ResponseBodyAdvice在SpringMVC項目中創(chuàng)建自定義響應(yīng)處理器,以及如何使用Wrapper類包裝和標準化返回結(jié)果,感興趣的朋友跟隨小編一起看看吧2025-01-01

