提取码: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(); } }
表数据并没有改变,说明更新操作被回滚了。