1.介紹
1)簡介:
DBUtils是一個小型的類庫,它使JDBC編程更加方便,簡單。在JDBC編程中,資源的關閉是顯式的,極易導致編程出現錯誤,DBUtils把這些工作抽象出來,使得程序員編程時僅需要關心正真的問題,即對數據庫的增刪改查。
2)優點:
杜絕資源泄露。修正JDBC代碼並不困難,但是這是耗時而乏味的,這通常導致連接泄露並且難以跟蹤到。
清潔乾淨的持久化代碼。大段的持久化數據到數據庫代碼徹底精簡,剩下的代碼清晰地表達了編碼的意圖。
從ResultSet裏自動組裝JavaBean。你不再需要手工set每一行每一列的值到bean中,每一行數據都將會以一個Bean實例的形式出現
3)適用場景:
通常初學者用JDBC比較多,只是初學者爲了打實基礎,練習階段少用框架和幫助類庫。
小型項目,小型項目不需要太多的數據庫操作,不需要考慮跨數據庫兼容問題,用框架並不會讓編碼更簡單。
需要高效率的項目,無論iBatis、Hibernate,到了底下還是JDBC,直接用JDBC訪問數據庫無疑是最優的效率最高的方案。
4)準備:
下載下來後(當然也可以使用maven工程),名稱爲commons-dbutils-1.6.jar,下面總共包含三個包,分別是:
其中的org.apache.commons.dbutils包主要有如下的接口和類:
ResultSetHandler——將ResultSet轉換爲別的對象的工具。
BeanProcessor——匹配列名到Bean屬性名,轉換結果集列到Bean對象的屬性。
DbUtils——一個JDBC輔助工具集合。
ProxyFactory——產生JDBC接口的代理實現。
QueryLoader——屬性文件加載器,用於加載屬性文件中的SQL到內存中。
QueryRunner——使用可插拔的策略執行SQL查詢並處理結果集。
ResultSetIterator——包裝結果集爲一個迭代器。
其中的org.apache.commons.dbutils.handlers包爲第一個包中ResultSetHandler接口的實現類:
AbstractListHandler——將ResultSet轉化爲List類型的抽象類。
ArrayHandler——將ResultSet轉化爲Object[]類型的實現類。
ArrayListHandler——將ResultSet轉化爲List<Object[]>
類型的實現類。
BeanHandler——將ResultSet轉化爲JavaBean類型的實現類。
BeanListHandler——將ResultSet轉化爲List<JavaBean>
類型的實現類。
ColumnListHandler ——將ResultSet轉化爲List<Object>
類型的實現類。
MapHandler ——將ResultSet轉換爲Map類型的實現類。
MapListHandler ——將ResultSet轉換爲List<Map>
類型的實現類。
KeyedHandler——將ResultSet轉換爲Map<Map>
類型的實現類。
ScalarHandler ——將ResultSet的一個列轉化到一個對象。
其中的org.apache.commons.dbutils.wrappers包:
SqlNullCheckedResultSet——在每個getXXX方法上檢查SQLNULL值的包裝類。
StringTrimmedResultSet——取出結果集中字符串左右空格的ResultSet包裝類。
在使用過程中只需要熟悉DbUtils、QueryRunner和ResultSetHandler的用法就足夠了。
DbUtils是一個做關閉連接,裝載JDBC驅動程序等工作的類,它裏面所有的方法都是靜態的:
Close()
:DbUtils類提供了三個重載的關閉方法。這些方法檢查所提供的參數是不是NULL,如果不是的話,它們就關閉連接(Connection)、聲明(Statement)和結果集(ResultSet)。
CloseQuietly()
:CloseQuietly這一方法不僅能在連接(Connection)、聲明(Statement)和結果集(ResultSet)爲NULL情況下避免關閉,還能隱藏一些在程序中拋出的SQLEeception。如果你不想捕捉這些異常的話,這對你是非常有用的。
CommitAndCloseQuietly
:這一方法用來提交連接,然後關閉連接,並且在關閉連接時不向上拋出在關閉時發生的一些SQL異常。
LoadDriver()
:這一方法裝載並註冊JDBC驅動程序,如果成功就返回TRUE。使用這種方法,你不需要去捕捉這個異常ClassNotFoundException。使用loadDriver()方法,編碼就變得更容易理解,你也就得到了一個很好的Boolean返回值,這個返回值會告訴你驅動類是不是已經加載成功了。
ResultSetHandler接口處理一個java.sql.ResultSet,將數據轉變爲其它的形式,該接口提供ArrayHandler、ArrayListHandler、BeanHandler、BeanListHandler、MapHandler、MapListHandler、ScalarHandler等執行程序。ResultSetHandler的執行需要一個結果集(ResultSet)作爲參數傳入,然後才能處理這個結果集,再返回一個對象。因爲返回類型是java.lang.Object,所以除了不能返回一個原始的Java類型之外,其它的返回類型並沒有什麼限制。如果你發現這七個執行程序中沒有任何一個提供了你想要的服務,你可以自己寫執行程序並使用它。
QueryRunner使執行SQL查詢簡單化了,它與ResultSetHandler串聯在一起有效地履行着一些平常的任務,它能夠大大減少你所要寫的編碼。它包含以下重要的方法:
query(Connection conn,String sql,Object[] params,ResultSetHandler rsh)
:這一方法執行一個選擇查詢,對象數組(Object[] params)中的值被用來作爲查詢語句sql的置換參數。該方法會內在地處理Statement和ResultSet的創建和關閉。ResultSetHandler對把從ResultSet得來的數據轉變成一個更容易的或是應用程序特定的格式來使用。
query(String sql,Object[] params,ResultSetHandler rsh)
:這幾乎與第一種方法一樣;唯一的不同在於它不將數據庫連接提供給方法,它是從提供給構造器的數據源(DataSource) 或使用的setDataSource 方法中重新獲得的。
query(Connection conn,String sql,ResultSetHandler rsh)
:該方法是執行一個不需要參數的查詢操作。
update(Connection conn,String sql,Object[] params)
:該方法用來執行插入、更新或者刪除操作,對象數組(Object[] params)中的值被用來作爲更新語句sql的置換參數。
2.使用
新建一個Java類:DBTest.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import bean.StudentBean;
public class DBTest {
public static void main(String[] args) {
insertData();
updateData();
selectData();
deleteData();
insertDataWithParams(1002,"kj",23);
}
public static void insertData() {
// 獲取數據庫連接
Connection conn = connectDB();
// 創建SQL執行工具
QueryRunner runner = new QueryRunner();
String sql = "insert into user(userId,userName,age) values(1001,'zx',21)";
int num;
try {
num = runner.update(conn, sql);
System.out.println("成功插入" + num + "條數據!");
} catch (SQLException e) {
e.printStackTrace();
}
// 關閉數據庫連接
DbUtils.closeQuietly(conn);
}
public static void insertDataWithParams(int userId, String userName, int age) {
// 獲取數據庫連接
Connection conn = connectDB();
// 創建SQL執行工具
QueryRunner runner = new QueryRunner();
String sql = "insert into user(userId,userName,age) values(?,?,?)";
Object[] params = { userId, userName, age };
try {
int num = runner.update(conn, sql, params);
System.out.println("成功插入" + num + "條數據!");
} catch (SQLException e) {
e.printStackTrace();
}
DbUtils.closeQuietly(conn);
}
public static void updateData() {
// 獲取數據庫連接
Connection conn = connectDB();
// 創建SQL執行工具
QueryRunner runner = new QueryRunner();
String sql = "update user set userName='xz' where userId=1001";
try {
int num = runner.update(conn, sql);
System.out.println("成功更新" + num + "條數據!");
} catch (SQLException e) {
e.printStackTrace();
}
DbUtils.closeQuietly(conn);
}
public static void deleteData() {
// 獲取數據庫連接
Connection conn = connectDB();
// 創建SQL執行工具
QueryRunner runner = new QueryRunner();
String sql = "delete from user where userName='xz'";
try {
int num = runner.update(conn, sql);
System.out.println("成功刪除" + num + "條數據!");
} catch (Exception e) {
e.printStackTrace();
}
DbUtils.closeQuietly(conn);
}
public static void selectData() {
// 獲取數據庫連接
Connection conn = connectDB();
// 創建SQL執行工具
QueryRunner runner = new QueryRunner();
String sql = "select * from user where userId=1001";
ArrayList<StudentBean> userList;
try {
userList = runner.query(conn, sql,new BeanListHandler(StudentBean.class));
System.out.println("userList size is:"+userList.size());
for (StudentBean studentBean : userList) {
System.out.println(studentBean);
}
} catch (SQLException e) {
e.printStackTrace();
}
DbUtils.closeQuietly(conn);
}
public static Connection connectDB() {
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://10.1.40.61:3306/test_bid_system?useUnicode=true&characterEncoding=utf8";
String userName = "root";
String password = "root";
Connection conn = null;
try {
Class.forName(driverClassName);
conn = DriverManager.getConnection(url, userName, password);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("獲取數據庫連接成功!");
return conn;
}
}
3.結束
DBUtils是比較輕巧地對JDBC進行了封裝,在簡化JDBC編程的目的下又不會失去JDBC的高效率。
閱讀DBUtils的源碼也是比較輕鬆,有幫助的。
參考資料:DBUtils使用詳解