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();
        }
    }

此时运行代码

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

原文地址:https://www.cnblogs.com/blizzawang/p/11411790.html

时间: 2024-12-16 10:22:45

DBUtils框架的使用(上)的相关文章

DBUtils框架

主要知识点: 一.多表关联操作(DBUtils框架) 1.一对多关系 *** 2.多对多关系 *** 3.一对一关系 二.分页 三.监听器组件(web三大组件之一) 四.踢人综合示例(监听器实现) 一.分页核心类总结: 1.分页必要性 select * from account; 分页的结果就是要让指定的记录加载到内存 1.人的习惯 2.内存的限度(核心问题) 3.屏幕的限度 2.如何做分页? 1.数据库层面的考虑 select * from account limit startIndex,s

javaweb学习总结(四十一)——Apache的DBUtils框架学习

一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能.因此dbutils成为很多不喜欢hibernate的公司的首选. commons-dbutilsAPI介绍: org.apache.commons.dbutils.QueryRunner org.apache.commons.dbutils.Resul

Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用

前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在需要存储一些数据,或者拿到一些数据的时候,就需要往数据库里存取数据,那么java如何连接数据库呢?需要哪些步骤? 1.注册驱动 什么是驱动? 驱动就是JDBC实现类,通俗点讲,就是能够连接到数据库功能的东西就是驱动,由于市面上有很多数据库,Oracle.MySql等等,所以java就有一个连接数据库

深入分析JavaWeb Item34 -- DBUtils框架学习

一.commons-dbutils简介 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能.因此dbutils成为很多不喜欢hibernate的公司的首选. commons-dbutilsAPI介绍: org.apache.commons.dbutils.QueryRunner org.apache.commons.dbutils.Resul

JDBC【数据库连接池、DbUtils框架、分页】

1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接池 编写连接池需实现java.sql.DataSource接口 创建批量的Connection用LinkedList保存[既然是个池,当然用集合保存..LinkedList底层是链表,对增删性能较好] 实现getConnetion(),让getConnection()每次调用,都是在LinkedLi

DBUtils框架ResultSetHandler接口学习

今儿在学习spring框架的时候,让我想起来之前做项目时一直搁置的一个问题,就是DBUtils框架的做数据库操作的使用,当时制作项目的时候就是通过实例打了一遍,由于时间原因也并没有仔细去了解这一方面.所以,今天来学习下对于这方面的使用. 通过查阅资料发现QueryRunner类的基本CRUD的使用 BDUtils简介 以下是我摘下来的一些认为重要的点 QueryRunner中一共有6种方法: execute(执行SQL语句) batch(批量处理语句) insert(执行INSERT语句) in

Apache—DBUtils框架简介

转载自:http://blog.csdn.net/fengdongkun/article/details/8236216 Apache—DBUtils框架简介.DbUtils类.QueryRunner类 .ResultSetHandler接口 commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能.因此dbutils成为很多不喜欢hibernat

笨鸟先飞之Java(一)--使用struts2框架实现文件上传和下载

不管是.net还是Java,我们最常接触到的就是文件的上传和下载功能,在Java里要实现这两个常用功能会有很多种解决方式,但是struts2的框架却能给我们一个比较简单的方式,下面就一起来看吧: 文件上传: 首先来看实现上传功能的表单,Index.jsp: <span style="font-family:FangSong_GB2312;font-size:18px;"><%@ page language="java" contentType=&q

基于jifnal框架的文件上传一般形式(img)

实现mvc模式基于jfinal框架 首先是上传接口: 前端代码基于bootstrap和插件ajaxfileupload.js的异步上传:test.html <script src="${base}/resources/js/ajaxfileupload.js" type="text/javascript"></script> <input  type="file"  id="map" name=&