DBUtils詳細介紹+實例

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,下面總共包含三個包,分別是:
  DBUtils的包結構
  
  其中的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包裝類。

  在使用過程中只需要熟悉DbUtilsQueryRunnerResultSetHandler的用法就足夠了。
  
  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使用詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章