# Commons_DbUtils

SSM ( Spring SpringMVC Mybatis (完全代替JDBC DBUtils )) Mybatis-plus

jsp + Servlet + JDBC ( DBUtils )

(1)引入commons-dbutils-x.x.jar

(2)创建QueryRunner对象,参数为连接池的对象,如果要支持事务不传参数

(3) 准备sql语句,准备数据

(4) 核心方法 update --->支持增删改 ,如果要支持事务,传入一个连接对象

query ---->支持查询 ,如果要支持事务,传入一个连接对象

(5)接收查询数据

​ |- 查询一条记录 ,使用 BeanHandler接收查询数据转化成一个实体类对象

​ |-查询多条记录,使用 BeanListHandler 接收查询数据转化为一个List

​ |-只查询到一个结果,如count(*),使用ScalarHandler 接收查询数据转化为一个Long类型数据

​ |-不规则数据,可以考虑MapHandler 或 MapListHandler

# 一、简介

DBUtils是Apache Commons组件中的一员,开源免费。是对JDBC的简单封装,但是它还是被很多公司使用。

主要功能:用来操作数据库,简化JDBC的操作。

在使用的时候要和数据库连接池、MySQL的jar包配合使用。

# 二、主要类及方法

QueryRunner:执行sql语句的类

  • 创建QueryRunner
    • 构造器:QueryRunner() ,在事务里面使用;
    • 构造器:QueryRunner(连接池对象)
  • update():执行INSERT、UPDATE、DELETE
  • query():执行SELECT

# 2.1、关于增删改

int update(String sql, Object... params): 可执行增、删、改语句

int update(Connection con, String sql, Object... parmas):需要调用者提供Connection,支持事务

# 2.2、关于查询

T query(String sql, ResultSetHandler rsh, Object... params): 可执行查询

T query(Connection con, String sql, ResultSetHadler rsh, Object... params): 需要调用者提供Connection,支持事务

# 2.2.1、ResultSetHandler接口

BeanHandler(单行):构造器需要一个Class类型的参数,用来把一行结果转换成指定类型的javaBean对象;

BeanListHandler(多行):构造器也是需要一个Class类型的参数,用来把一行结果集转换成一个javabean,那么多行就是转换成List对象,一堆javabean;

MapHandler(单行):把一行结果集转换Map对象;

MapListHandler(多行):把一行记录转换成一个Map,多行就是多个Map,即List<Map> 集合的嵌套

ScalarHandler(单行单列):通常用与select count(*) from t_stu语句!结果集是单行单列的!它返回一个Object 聚合函数。

# 三、使用

# 3.1、建库建表

DROP DATABASE IF EXISTS mydbutils;

CREATE DATABASE mydbutils;
USE mydbutils;

CREATE TABLE tb_stu ( 
    sid INT PRIMARY KEY auto_increment, 
    sname VARCHAR (50), 
    sage INT, 
    sgender VARCHAR (10) 
);
INSERT INTO tb_stu(sname, sage, sgender) VALUES('John', 20, "male");
INSERT INTO tb_stu(sname, sage, sgender) VALUES('bob', 20, "male");

CREATE TABLE USER(
    username VARCHAR (20), 
    password VARCHAR (20)
);
INSERT INTO USER VALUES('Peter', '123');
INSERT INTO USER VALUES('John', '123');

CREATE TABLE account  (
  id int(11) NOT NULL AUTO_INCREMENT,
  cardnum varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  money decimal(10, 0) NULL DEFAULT NULL,
  PRIMARY KEY (id) USING BTREE
);
INSERT INTO account VALUES (1, '10001', 5000);
INSERT INTO account VALUES (2, '10002', 5000);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 3.2、项目搭建

  1. 新建Java项目;
  2. 在项目下新建lib目录;
  3. 将MySQL驱动Jar包、Druid连接池Jar包、DbUtils的Jar包拷贝到lib目录下;
  4. 选中lib目录右键Add as Library--单击OK;
  5. 将之前使用的最新版本的JdbcUtils工具类拷贝到项目中,并增加如下的方法。
//获取连接池对象
public static DataSource getDataSource() {
    return dataSource;
}
1
2
3
4

# 3.3、创建实体类

public class Student {
	private int sid;
	private String sname;
	private int sage;
	private String sgender;
    
    //get、set
    //toString...
}
1
2
3
4
5
6
7
8
9

# 3.4、DbUtils使用

import com.qfedu.entity.Student;
import com.qfedu.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.junit.Test;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.List;

public class MyTest {
    private DataSource dataSource = JdbcUtils.getDataSource();

    //测试添加
    @Test
    public void testAdd() {
        //创建QueryRunner
        QueryRunner qr = new QueryRunner(dataSource);
        //SQL
        String sql = "INSERT INTO tb_stu(sname, sage, sgender) VALUES(?, ?, ?)";
        int result = 0;
        //参数
        Object[] params = {"zhangsan", 12, "male"};
        //操作--增
        try {
            result = qr.update(sql, params);
            System.out.println(result);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //测试删除
    @Test
    public void testDel() {
        QueryRunner qr = new QueryRunner(dataSource);

        String sql = "DELETE FROM tb_stu WHERE sid=?";
        int result = 0;

        Object[] params = {5};

        try {
            result = qr.update(sql, params);
            System.out.println(result);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //测试修改
    @Test
    public void testUpdate() {
        QueryRunner qr = new QueryRunner(dataSource);

        String sql = "UPDATE tb_stu SET sname=? WHERE sid=?";
        int result = 0;

        Object[] params = {"zs", 1};

        try {
            result = qr.update(sql, params);
            System.out.println(result);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //测试查询
    @Test
    public void testSelect1() {
        QueryRunner qr = new QueryRunner(dataSource);
        String sql = "SELECT * FROM tb_stu WHERE sid=?";
        Student stu = null;
        Object[] params = {1};
        try {
            stu = qr.query(sql, new BeanHandler<Student>(Student.class), params);
            System.out.println(stu);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //测试查询
    @Test
    public void testSelect2() {
        QueryRunner qr = new QueryRunner(dataSource);
        String sql = "SELECT * FROM tb_stu";
        List<Student> list = null;
        try {
            list =  qr.query(sql, new BeanListHandler<Student>(Student.class));
            for (Student student : list) {
                System.out.println(student);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //测试查询
    @Test
    public void testSelect3() {
        QueryRunner qr = new QueryRunner(dataSource);
        String sql = "SELECT count(*) FROM tb_stu";

        long count = 0;

        try {
            count = qr.query(sql, new ScalarHandler<Long>());
            System.out.println(count);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117

# 3.5、事务

以下代码基于03_事务2.4.2、2.4.3的代码

# 3.5.1、DAO代码

import com.qfedu.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class AccountDao {
    /*
     * 提款withdrawal
     * */
    public void withdrawal(String cardNum, double money) throws SQLException {
        String sql = "update account set money=money-? where cardNum=?";

        Object[] params = {money, cardNum};

        QueryRunner qr = new QueryRunner();
        qr.update(JdbcUtils.getConnection(), sql, params);
    }

    /*
     * 存款deposit
     * */
    public void deposit(String cardNum, double money) throws SQLException {
        String sql = "update account set money=money+? where cardNum=?";

        Object[] params = {money, cardNum};

        QueryRunner qr = new QueryRunner();
        qr.update(JdbcUtils.getConnection(), sql, params);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 3.5.1、Service代码

import com.qfedu.dao.AccountDao;
import com.qfedu.utils.JdbcUtils;

import java.sql.SQLException;

public class AccountService {
    private AccountDao accountDao = new AccountDao();

    //转账操作
    public void trans(String src, String dst, double money) {

        try {
            JdbcUtils.beginTransaction();
            accountDao.withdrawal(src, money);

            //int i = 100/0;

            accountDao.deposit(dst, money);
            JdbcUtils.commitTransaction();
        } catch (Exception e) {
            e.printStackTrace();
            try {
                JdbcUtils.rollbackTransaction();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# 3.5.2、测试代码

@Test
public void testTransaction() {
    AccountService accountService = new AccountService();

    accountService.trans("10001", "10002", 1000);
}
1
2
3
4
5
6
上次更新: 2024/4/13