昨天做了这么多的铺垫,当然就是为了引出今天的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();
}
}

此时运行代码



表数据并没有改变,说明更新操作被回滚了。

最新文章

  1. a版本冲刺第二天
  2. iOS7时代我们用什么来追踪和识别用户?
  3. Mac os x下配置nginx + php
  4. 我的电脑右下角的日期也不见了只剩下时间,Win7系统,请问是什么原因啊?
  5. PAT (Advanced Level) 1101. Quick Sort (25)
  6. 自定义分布式RESTful API鉴权机制
  7. (转)Linux下安装firefox最新版
  8. 阿里消息队列中间件 RocketMQ 源码分析 —— Message 拉取与消费(上)
  9. 给定n,求1/x + 1/y = 1/n (x<=y)的解数~hdu-1299~(分解素因子详解)
  10. iOS开发-OC数据类型
  11. c++ 文件操作详解
  12. 基于jeesite的cms系统(七):GlobalException全局异常和部署
  13. Oracle从入门到精通(详细) 明日科技
  14. Confluence 6 Windows 中以服务方式自动重启修改运行服务的用户
  15. 【杂谈】对IO与NIO的认识
  16. BZOJ.3545.[ONTAK2010]Peaks(线段树合并)
  17. JDK、JRE与JVM的关系
  18. 取出csv文件中的中文评论数据
  19. Spring AsyncRestTemplate
  20. Django 一些少用却很实用的orm查询方法

热门文章

  1. DFA最小化,语法分析初步
  2. kafka2.3.1+zookeeper3.5.6+kafka-manager2.0.0.2集群部署(centos7.7)
  3. Hive concat函数连接后结果为null
  4. STL常用结构与方法简明总结
  5. git命令行的颜色配置
  6. sqlserver 筛选索引(filter index)在使用时需要注意的事项
  7. python 中model.py详解
  8. 11 K-Means 原理及案例
  9. 池化技术(一)Druid是如何管理数据库连接的?
  10. Python元组是什么