提取碼:skrf
複製這段內容後打開百度網盤手機App,操作更方便哦
- org.apache.commons.dbutils.QueryRunner --- 核心操作類
- org.apache.commons.dbutils.ResultSetHandler
- org.apache.commons.dbutils.DbUtils --- 工具類
QueryRunner類提供了兩個構造方法:
默認的構造方法
需要一個 javax.sql.DataSource 來作參數的構造方法。
如果使用QueryRunner()構造QueryRunner對象,就需要自己來管理事務,因爲框架沒有連接池,無法獲得數據庫的連接,此時應該使用帶Connection參數的方法。
新建一個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);}
然後運行測試代碼
插入成功。
@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); }
修改成功。
@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(); } }
表數據並沒有改變,說明更新操作被回滾了。