DBUtils框架的使用(上)
昨天做了这么多的铺垫,当然就是为了引出今天的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();
编写插入的测试代码
@test public 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,编写测试代码
@test public void testdelete() throws sqlexception{ queryrunner queryrunner = new queryrunner(datasource); string sql = "delete from account where id = ?"; queryrunner.update(sql,2); }
运行测试代码
删除成功。
现在我们来模拟一个转账的情景。
@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(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(); } }
此时运行代码
表数据并没有改变,说明更新操作被回滚了。
上一篇: Android进阶之绘制-自定义View完全掌握(二)
下一篇: 怎么兼职或者全职在网上赚钱