DBUtils框架的使用(上)

commons-dbutils 是 Apache 組織提供的一個開源 JDBC工具類庫,它是對JDBC的簡單封裝,學習成本極低,並且使用dbutils能極大簡化jdbc編碼的工作量,同時也不會影響程序的性能。因此dbutils成爲很多不喜歡hibernate的公司的首選。
jar包下載地址:鏈接:https://pan.baidu.com/s/1BKtq_VoBw52qyIJr6c_CZg
提取碼:skrf
複製這段內容後打開百度網盤手機App,操作更方便哦
API介紹:
  • org.apache.commons.dbutils.QueryRunner --- 核心操作類
  • org.apache.commons.dbutils.ResultSetHandler
  • org.apache.commons.dbutils.DbUtils --- 工具類
QueryRunner 類簡單化了SQL查詢,它與ResultSetHandler組合在一起使用可以完成大部分的數據庫操作,能夠大大減少編碼量。
QueryRunner類提供了兩個構造方法:
默認的構造方法
需要一個 javax.sql.DataSource 來作參數的構造方法。
QueryRunner類有四個重載的構造方法,如果使用QueryRunner(DataSource ds)構造QueryRunner對象,數據庫事務將交給DBUtils框架進行管理,默認情況下每一個sql單獨一個事務。此時應該使用不帶Connection參數的方法。
如果使用QueryRunner()構造QueryRunner對象,就需要自己來管理事務,因爲框架沒有連接池,無法獲得數據庫的連接,此時應該使用帶Connection參數的方法。
Dbutils工具類能夠加載驅動、關閉資源、控制事務,所以之前的一些繁瑣工作都可以藉助該工具類實現。
編寫案例演示一下。
新建一個web項目,不要忘了導入jar包。
新建測試類QueryRunnerTest
先在類中定義一個成員變量,方便後續測試

    private static ComboPooledDataSource dataSource = new ComboPooledDataSource();

編寫插入的測試代碼

@Testpublic void testInsert() throws SQLException{    //1、創建QueryRunner對象    QueryRunner queryRunner = new QueryRunner(dataSource);    //2、準備方法參數    String sql ="insert into account values(null,?,?)";    Object[] param = {"fff",1000};    //3、調用方法    queryRunner.update(sql, param);}

使用該構造方法構造的QueryRunner對象是不需要手動釋放資源的,因爲連接交由DBUtils工具包管理了,它會幫助我們釋放資源。
然後運行測試代碼
 

插入成功。
接下來測試一下更新sql,編寫測試代碼

    @Test    public void testUpdate() throws SQLException{        QueryRunner queryRunner = new QueryRunner(dataSource);        String sql = "update account set money = ? where name = ?";        Object[] param = {2000,"fff"};        queryRunner.update(sql,param);    }

運行測試代碼
 

修改成功。
接下來測試一下刪除sql,編寫測試代碼

@Testpublic void testDelete() throws SQLException{    QueryRunner queryRunner = new QueryRunner(dataSource);    String sql = "delete from account where id = ?";    queryRunner.update(sql,2);}

運行測試代碼
 

刪除成功。
現在我們來模擬一個轉賬的情景。

@Testpublic void testTransfer() throws SQLException{    double  money = 100;    String outAccount = "aaa";    String inAccount = "bbb";    String sql1 = "update account set money = money - ? where name = ?";    String sql2 = "update account set money = money + ? where name = ?";        QueryRunner queryRunner = new QueryRunner(dataSource);    queryRunner.update(sql1,money,outAccount);    //產生一個錯誤    int d = 1 / 0;    queryRunner.update(sql2,money,inAccount);}

運行測試代碼
 

程序報錯,aaa賬戶少了100,而bbb賬戶金額並沒有多,這是因爲你把連接交給了DBUtils管理,默認一條sql就是一個事務,所以,我們應該自己來管理事務,才能避免這種情況發生。
修改轉賬代碼

    @Test    public void testTransfer() throws SQLException{        double  money = 100;        String outAccount = "aaa";        String inAccount = "bbb";        String sql1 = "update account set money = money - ? where name = ?";        String sql2 = "update account set money = money + ? where name = ?";                //手動事務管理        QueryRunner queryRunner = new QueryRunner();        Connection conn = JDBCUtils.getConnection();        conn.setAutoCommit(false);        try {            queryRunner.update(conn,sql1,money,outAccount);            //產生一個錯誤            int d = 1 / 0;            queryRunner.update(conn,sql2,money,inAccount);                        DbUtils.commitAndCloseQuietly(conn);        } catch (Exception e) {            DbUtils.rollbackAndCloseQuietly(conn);            e.printStackTrace();        }    }

此時運行代碼
 

表數據並沒有改變,說明更新操作被回滾了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章