Common Dbutils詳解
1. 介紹
commons-dbutils是Apache組織提供的一個開源 JDBC工具類庫,能讓我們更簡單的使用JDBC。它是一個非常小的類包,花幾分鐘的時間就能掌握它的使用。
2. 下載
進入apache官方網站的commons-dbutils網頁:http://commons.apache.org/dbutils/
選擇左邊導航欄的Download進入下載頁面:
Binary:是編譯好的jar包;source是源代碼包。下載一份Binary到本地。解開后如下圖所示:
其中commons-dbutils-1.1.jar就是供使用的jar包;docs是這個組件的幫助文檔。下面就通過示例介紹它的使用。
3. API介紹
commons-dbutils是一個非常小的類包, 無需花費太多時間去閱讀它的doc,核心只是兩個類org.apache.commons.dbutils.DbUtils、org.apache.commons.dbutils.QueryRunner和一個接口org.apache.commons.dbutils.ResultSetHandler。
3.1. DbUtils類
DbUtils是一個用來做一些如關閉連接、裝載JDBC驅動程序之類的常規工作提供有用方法的類,它里面所有的方法都是靜態的。
這個類里的重要方法有:
n public static void close(…) throws java.sql.SQLException: DbUtils類提供了三個重載的關閉方法。這些方法檢查所提供的參數是不是NULL,如果不是的話,它們就關閉Connection、Statement和ResultSet。
n public static void closeQuietly(…): 這一類方法不僅能在Connection、Statement和ResultSet為NULL情況下避免關閉,還能隱藏一些在程序中拋出的SQLEeception。如果你不想捕捉這些異常的話,這對你是非常有用的。在重載CloseQuietly方法時,特別有用的一個方法是closeQuietly(Connection conn,Statement stmt,ResultSet rs),這是因為在大多數情況下,連接、聲明和結果集(ResultSet)是你要用的三樣東西,而且在最后的塊你必須關閉它們。使用這一方法,你最后的塊就可以只需要調用這一方法即可。
n public static void CommitAndCloseQuietly(Connection conn): 這一方法用來提交連接,然后關閉連接,并且在關閉連接時不向上拋出在關閉時發生的一些SQL異常。
n public static boolean loadDriver(java.lang.String driverClassName):這一方法裝載并注冊JDBC驅動程序,如果成功就返回true。使用這種方法,你不需要去捕捉這個異常ClassNotFoundException。
3.2. QueryRunner類
這個類簡單化了執行SQL查詢,它與ResultSetHandler組合在一起使用就可能完成大部分的數據庫操作,它能夠大大減少你所的編碼量。
QueryRunner類提供了兩個構造方法:一個是默認的構造方法;另一個需要一個 javax.sql.DataSource 來作為參數。因此,在你不用為一個方法提供一個數據庫連接的情況下,提供給構造器的DataSource)被用來獲得一個新的連接并將繼續進行下去。
這個類中的重要方法包括以下這些:
n public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:執行一個查詢操作,在這個查詢中,對象數組中的每個元素值被用來作為查詢語句的置換參數。該方法它會內在地處理PreparedStatement 和ResultSet 的創建和關閉。最重要的是參數ResultSetHandler會把從 ResultSet中獲得的數據轉換成一個更容易的或是應用程序特定的格式供我們使用。
n public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 這幾乎與第一種方法一樣;唯一的不同在于它不將數據庫連接提供給方法,并且它是從提供給構造方法的數據源(DataSource) 或使用的setDataSource 方法中重新獲得的。
n public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 執行一個不需要置換參數的查詢操作。
n public int update(Connection conn, String sql, Object[] params) throws SQLException:用來執行一個更新(插入、更新或刪除)操作。
n public int update(Connection conn, String sql) throws SQLException:用來執行一個更新操作,不需要置換參數。
3.3. ResultSetHandler接口
正如它的名字所提示的,這一接口執行處理一個jaca.sql.ResultSet,將數據按要求轉換為另一種形式。
ResultSetHandler接口提供了一個單獨的方法:Object handle (java.sql.ResultSet .rs)。因此任何ResultSetHandler 的執行需要一個結果集(ResultSet)作為參數傳入,然后才能處理這個結果集,再返回一個對象。因為返回類型是java.lang.Object,所以除了不能返回一個原始的Java類型之外,其它的返回類型并沒有什么限制。。
common-dbutils組件包針對這個接口提供了九個實現類:
n ArrayHandler:把結果集中的第一行數據轉成對象數組。
n ArrayListHandler:把結果集中的每一行數據都轉成一個對象數組,再存放到List中。
n BeanHandler:將結果集中的第一行數據封裝到一個對應的JavaBean實例中。
n BeanListHandler:將結果集中的每一行數據都封裝到一個對應的JavaBean實例中,存放到List里。
n ColumnListHandler:將結果集中某一列的數據存放到List中。
n KeyedHandler:將結果集中的每一行數據都封裝到一個Map里,然后再根據指定的key把每個Map再存放到一個Map里。
n MapHandler:將結果集中的第一行數據封裝到一個Map里,key是列名,value就是對應的值。
n MapListHandler:將結果集中的每一行數據都封裝到一個Map里,然后再存放到List
n ScalarHandler:將結果集中某一條記錄的其中某一列的數據存成Object
如果這九個實現類中沒有任何一個提供了你想要的服務,你可以自己寫一個實現類。
3.4. 其它類和接口
org.apache.commons.dbutils.QueryLoader類:屬性文件加載器,主要用于加載屬性文件中的SQL到內存中。
org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet類:這個類是用來對sql語句執行完成之后的的數值進行null的替換。
org.apache.commons.dbutils.wrappers.StringTrimmedResultSet類: 去除ResultSet中字段的左右空格。
org.apache.commons.dbutils.RowProcessor</span>接口: 它提供了把結果集的行數據轉換成其它格式的功能。它的實現類是org.apache.commons.dbutils.BasicRowProcessor</span>類。例子:
表結構可以參照javabean普通
1.數據庫連接類:DBConnection.java
imp
imp
imp
public class DBConnection {
private static DBConnection instance = new DBConnection();
public static DBConnection getInstance(){
return instance;
}
public Connection getConn(){
Connection conn=null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xxx","xxx", "xxx");
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
- 普通JavaBean:</span></span></span></span></span>InfoBean.java</span></span></span></span>
public class InfoBean {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 數據庫操作:Oper.java
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
public class Oper {
private static Oper instance = new Oper();
public static Oper getInstance(){
return instance;
}
/
獲取全部內容(使用MapListHandler)
@return
/
public List<?> getAll() throws SQLException{
String sql="select id,name from test";
return query(sql, null, null);
}
/
獲取全部內容(使用BeanListHandler)
@return
/
public List<?> getAllByBean() throws SQLException{
String sql="select id,name from test";
return query(sql, null, InfoBean.class);
}
/
根據條件獲取內容
@param id
@return
*/
public List<?> getInfoById(String id) throws SQLException{
String sql="select id,name from test where id = ?";
Object[] object = new Object[1];
object[0]=id;
return query(sql, object, InfoBean.class);
}
/
添加內容
@throws SQLException
/
public void insert() throws SQLException{
String sql="insert into test(id,name) values(?,?)";
Object[] object = new Object[2];
object[0]="5";
object[1]="ee";
operDB(sql,object);
}
/
根據ID修改內容
@throws SQLException
/
public void update(String id) throws SQLException{
String sql="update test set name = ? where id = ? ";
Object[] object = new Object[2];
object[0]="ee1";
object[1]=id;
operDB(sql,object);
}
/
根據ID刪除內容
@throws SQLException
/
public void delete(String id) throws SQLException{
String sql="delete from test where id = ? ";
Object[] object = new Object[1];
object[0]=id;
operDB(sql,object);
}
/
數據庫操作方法
@param sql sql語句
@param object 參數
@throws SQLException
/
private void operDB(String sql, Object[] object) throws SQLException{
Connection conn=DBConnection.getInstance().getConn();
try {
QueryRunner qr=new QueryRunner();
qr.update(conn, sql,object);
}
catch (SQLException e) {
throw e;
}finally{
DbUtils.close(conn);
}
}
/
查詢操作
@param sql sql語句
@param param 參數
@return
@throws SQLException
*/
public List<?> query(String sql, Object[] param, Class<?> clazz) throws SQLException{
List<?> list = null;
Connection conn=DBConnection.getInstance().getConn();
QueryRunner qr=new QueryRunner();
try {
if(clazz!=null){
list=(List<?>)qr.query(conn, sql, new BeanListHandler(clazz), param);
}else{
list=(List<?>)qr.query(conn,sql, new MapListHandler(), param);
}
}
catch (SQLException e) {
throw e;
}finally{
DbUtils.close(conn);
}
return list;
}
public static void main(String[] args) {
try {
List<?> l=Oper.getInstance().getAll();
for(Object temp:l){
Map<?,?> map=(Map<?,?>)temp;
System.out.println(map.get("name"));
}
//
// List<?> l=Oper.getInstance().getAllByBean();
// for(Object temp:l){
// InfoBean ib=(InfoBean)temp;
// System.out.println(ib.getName());
// }
//
// List<?> l = Oper.getInstance().getInfoById("1");
// for(Object temp:l){
// InfoBean ib=(InfoBean)temp;
// System.out.println(ib.getName());
// }
// Oper.getInstance().insert();
// Oper.getInstance().update("4");
// Oper.getInstance().delete("5");
}
catch (SQLException e) {
e.printStackTrace();
}
}
}</span></span></span></span></span>