3. Apache-DBUtils实现CRUD操作

Java
385
0
0
2022-11-12
标签   apache

3. Apache-DBUtils实现CRUD操作

1. Apache-DBUtils简介

  • commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。

1.1 DBUtils的常用API介绍

  1. 创建QueryRunner对象的API QueryRunner(DataSource ds) ,提供数据源(连接池),DBUtils底层自动维护连接connection
  2. 执行增删改的SQL语句的API int update(String sql, Object... params),执行增删改的SQL语句, params参数就是可变参数,参数个数取决于语句中问号的个数
  3. 执行查询的SQL语句的API query(String sql, ResultSetHandlerrsh, Object... params),其中ResultSetHandler是一个接口,表示结果集处理者

2. JavaBean(POJO)

2.1 JavaBean(POJO) 的介绍

在使用 Apache-DBUtils 之前,我们首先来理解一下 JavaBean。当我们从数据库中查询到了数据,那么将数据保存起来的最好方式就是 JavaBean,其实也就是写一个对应该表的 类,用来封装数据使用。

不过也是有要求的,如下:

JavaBean要求

  • 私有字段
  • 提供公共的get/set方法
  • 无参构造
  • 实现Serializable

JavaBean的 字段和属性

  • 字段: 全局/成员变量 eg: private String username
  • 属性: 去掉get或者set首字母变小写 eg: setUsername-去掉set->Username-首字母变小写->username
“一般情况下,我们通过IDEA直接生成的set/get 习惯把字段和属性搞成一样而言 ”

2.2 JavaBean的示例

下面我们简单写一个对应 user 表数据的 JavaBean 如下:

img

package com.pojo;

import java.io.Serializable;

/**
 * @author Aron.li
 * @date 2021/1/19 23:04
 */
public class User implements Serializable {

    /**
     * 成员属性
     * id
     * uname
     * age
     * sex
     */ 
    private Integer id;
    private String uname;
    private String age;
    private String sex;

    public User() {
    }

    public User(Integer id, String uname, String age, String sex) {
        this.id = id;
        this.uname = uname;
        this.age = age;
        this.sex = sex;
    }

    @Override 
    public String toString() {
        return "User{" +
                "id=" + id +
                ", uname='" + uname + '\'' +
                ", age='" + age + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

3. 下载 DBUtils 的 JAR 包,查看说明文档

我们使用 DBUtils 可以直接下载 jar 包,导入项目中,操作如下。也可以使用 maven 来下载依赖,后续也会讲解。

3.1 下载 DbUtils 的 jar 包

http://commons.apache.org/proper/commons-dbutils/download_dbutils.cgi

img

下载好的 jar 包如下:

img

image-20201028222511895

将 jar 包加入项目中,如下:

img

3.2 查看 DbUtils 的开发文档

img

下面我们首先来看看 QueryRunner 添加数据的更新方法,如下:

img

4.使用 Maven 设置 DBUtils 的 依赖

访问 https://mvnrepository.com/ 搜索 dbutils

img

img

<!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
<dependency> 
    <groupId>commons-dbutils</groupId> 
    <artifactId>commons-dbutils</artifactId> 
    <version>1.7</version>
</dependency>

在项目的 pom.xml 中设置依赖,如下:

img

    <!--  设置依赖  --> 
    <dependencies> 
        <!--  按下 alt + insert 搜索依赖      --> 
        <!-- dbutils 依赖       --> 
        <!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils --> 
        <dependency> 
            <groupId>commons-dbutils</groupId> 
            <artifactId>commons-dbutils</artifactId> 
            <version>1.7</version> 
        </dependency> 
        <!--  druid依赖      --> 
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> 
        <dependency> 
            <groupId>com.alibaba</groupId> 
            <artifactId>druid</artifactId> 
            <version>1.2.4</version> 
        </dependency> 
        <!--  C3P0依赖      --> 
        <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --> 
        <dependency> 
            <groupId>com.mchange</groupId> 
            <artifactId>c3p0</artifactId> 
            <version>0.9.5.5</version> 
        </dependency> 
        <!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java --> 
        <dependency> 
            <groupId>com.mchange</groupId> 
            <artifactId>mchange-commons-java</artifactId> 
            <version>0.2.20</version> 
        </dependency> 
        <!--  mysql连接依赖      --> 
        <dependency> 
            <groupId>mysql</groupId> 
            <artifactId>mysql-connector-java</artifactId> 
            <version>5.1.49</version> 
        </dependency> 
        <!--  注入junit依赖      --> 
        <dependency> 
            <groupId>junit</groupId> 
            <artifactId>junit</artifactId> 
            <version>4.12</version> 
            <scope>test</scope> 
        </dependency> 
    </dependencies>

5. 使用DBUtils完成增删改

5.1 步骤

  1. 创建QueryRunner()对象,传入dataSource
  2. 调用update()方法

5.2 实现

5.2.1 首先查询一下插入之前的数据表

mysql> select * from user;
+----+-----------+-----------+-----------+-------------+
| id | name      | password  | address   | phone       |
+----+-----------+-----------+-----------+-------------+
|  1 | 章子怡    | qwerty    | Beijing   | 13788658672 |
|  2 | 郭富城    | abc123    | HongKong  | 15678909898 |
|  3 | 林志颖    | 654321    | Taiwan    | 18612124565 |
|  4 | 梁静茹    | 987654367 | malaixiya | 18912340998 |
|  5 | LadyGaGa  | 123456    | America   | 13012386565 |
+----+-----------+-----------+-----------+-------------+
5 rows in set (0.00 sec)

5.2.2 编写 insert 插入的示例

img

/**
 * 使用 DruidUtil 的 QueryRunner 插入数据
 */
@Test
public void test01() throws SQLException {
    //目标:执行添加数据的SQL语句

    // 1. 设置插入数据的SQL 
    String sql = "insert into user values (null,?,?,?,?)";

    // 2. 使用德鲁伊工具类,获取连接池 
    DataSource dataSource = DruidUtil.getDataSource();

    //3. 创建QueryRunner对象 
    QueryRunner queryRunner = new QueryRunner(dataSource);

    //4. 使用QueryRunner对象调用update(sql,...)执行增删改的SQL语句 
    int i = queryRunner.update(sql, "特朗普", "tlbsb", "USA", "123456");
    System.out.println(i);
}

插入后的数据如下:

mysql> select * from user;
+----+-----------+-----------+-----------+-------------+
| id | name      | password  | address   | phone       |
+----+-----------+-----------+-----------+-------------+
|  1 | 章子怡    | qwerty    | Beijing   | 13788658672 |
|  2 | 郭富城    | abc123    | HongKong  | 15678909898 |
|  3 | 林志颖    | 654321    | Taiwan    | 18612124565 |
|  4 | 梁静茹    | 987654367 | malaixiya | 18912340998 |
|  5 | LadyGaGa  | 123456    | America   | 13012386565 |
|  6 | 特朗普    | tlbsb     | USA       | 123456      | -- 插入的数据
|  7 | 特朗普    | tlbsb     | USA       | 123456      |
+----+-----------+-----------+-----------+-------------+
7 rows in set (0.00 sec)

mysql> 

5.2.3 编写 update 更新数据的示例

img

/**
 * 使用 DruidUtil 的 QueryRunner 更新数据
 */
@Test
public void test02() throws SQLException {
    //目标:执行更新数据的SQL语句

    // 1. 设置更新数据的SQL 
    String sql = "update user set name = ? where id = ?";

    // 2. 使用德鲁伊工具类,获取连接池 
    DataSource dataSource = DruidUtil.getDataSource();

    //3. 创建QueryRunner对象 
    QueryRunner queryRunner = new QueryRunner(dataSource);

    //4. 使用QueryRunner对象调用update(sql,...)执行增删改的SQL语句 
    int i = queryRunner.update(sql, "拜登", "7");
    System.out.println("受影响的行数: " + i);
}

5.2.5 编写 delete 删除数据的示例

img

/**
 * 使用 DruidUtil 的 QueryRunner 删除数据
 */
@Test
public void test03() throws SQLException {
    //目标:执行删除数据的SQL语句

    // 1. 设置更新数据的SQL 
    String sql = "delete from user where id = ?";

    // 2. 使用德鲁伊工具类,获取连接池 
    DataSource dataSource = DruidUtil.getDataSource();

    //3. 创建QueryRunner对象 
    QueryRunner queryRunner = new QueryRunner(dataSource);

    //4. 使用QueryRunner对象调用update(sql,...)执行增删改的SQL语句 
    int i = queryRunner.update(sql, "6");
    System.out.println("受影响的行数: " + i);
}

5.3 小结

  1. 创建QueryRuner()对象, 传入DataSource
  2. 调用update(String sql, Object...params)

6. 使用DBUtils完成查询

6.1 步骤

  1. 创建QueryRunner()对象 传入DataSource
  2. 调用query(sql, resultSetHandler,params)方法

6.2 ResultSetHandler结果集处理类介绍

img

6.3 代码实现

6.3.1 首先准备好一个 JavaBean,用来保存查询的结果

package com.pojo;

public class User2 {

    // | id | name      | password  | address   | phone       | 
    private Integer id;
    private String name;
    private String password;
    private String address;
    private String phone;

    public User2() {
    }

    public User2(Integer id, String name, String password, String address, String phone) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.address = address;
        this.phone = phone;
    }

    @Override 
    public String toString() {
        return "User2{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

3.2.1 查询一条数据封装到JavaBean对象中(使用BeanHandler)

img

/**
 * 查询一条数据封装到JavaBean对象中(使用BeanHandler)
 */
@Test
public void test04() throws SQLException {
    // 1. 设置更新数据的SQL 
    String sql = "select * from user where id = ?";

    // 2. 使用德鲁伊工具类,获取连接池 
    DataSource dataSource = DruidUtil.getDataSource();

    //3. 创建QueryRunner对象 
    QueryRunner queryRunner = new QueryRunner(dataSource);

    //4.执行SQL语句,将结果封装到 POJO 对象中 
    User2 user = queryRunner.query(sql, new BeanHandler<>(User2.class), 7);
    System.out.println(user);
}

3.2.2 查询多条数据封装到List中(使用BeanListHandler)

img

    /**
     *  查询多条数据封装到List<JavaBean>中(使用BeanListHandler)
     */ 
    @Test 
    public void test05() throws SQLException {
        // 1. 设置更新数据的SQL 
        String sql = "select * from user where id > ?";

        // 2. 使用德鲁伊工具类,获取连接池 
        DataSource dataSource = DruidUtil.getDataSource();

        //3. 创建QueryRunner对象 
        QueryRunner queryRunner = new QueryRunner(dataSource);

        //4.执行SQL语句
        List<User2> userList = queryRunner.query(sql, new BeanListHandler<>(User2.class), 2);

        //5.遍历查询到的结果 
        for (User2 user : userList) {
            System.out.println(user);
        }
        
    }

3.2.3 查询一条数据,封装到Map对象中(使用MapHandler)

img

/**
 *  查询一条数据,封装到Map对象中(使用MapHandler)
 */
@Test
public void test06() throws SQLException {
    // 1. 设置更新数据的SQL 
    String sql = "select * from user where id = ?";

    // 2. 使用德鲁伊工具类,获取连接池 
    DataSource dataSource = DruidUtil.getDataSource();

    //3. 创建QueryRunner对象 
    QueryRunner queryRunner = new QueryRunner(dataSource);

    //4.执行SQL语句 
    // 查询一条数据,封装到Map中: 结果集的字段名就是map的key,结果集的字段值就是map的value
    Map<String, Object> map = queryRunner.query(sql, new MapHandler(), 3);

    //5.遍历查询到的结果
    System.out.println(map);
}

3.2.4 查询多条数据,封装到List<Map>对象中(使用MapListHandler)

img

    /**
     *  查询多条数据,封装到`List<Map>`对象中(使用MapListHandler)
     */ 
    @Test 
    public void test07() throws SQLException {
        // 1. 设置更新数据的SQL 
        String sql = "select * from user where id > ?";

        // 2. 使用德鲁伊工具类,获取连接池 
        DataSource dataSource = DruidUtil.getDataSource();

        //3. 创建QueryRunner对象 
        QueryRunner queryRunner = new QueryRunner(dataSource);

        //4.执行SQL语句 
        List<Map<String, Object>> mapList = queryRunner.query(sql, new MapListHandler(), 3);

        //5.遍历查询到的结果 
        for (Map<String, Object> map : mapList) {
            System.out.println(map);
        }

    }

3.2.5 查询单个数据(使用ScalarHandler())

img

    /**
     *  查询单个数据(使用ScalarHandler())
     */ 
    @Test 
    public void test08() throws SQLException {

        // 1. 设置更新数据的SQL 
        String sql = "select count(*) from user";

        // 2. 使用德鲁伊工具类,获取连接池 
        DataSource dataSource = DruidUtil.getDataSource();

        //3. 创建QueryRunner对象 
        QueryRunner queryRunner = new QueryRunner(dataSource);

        //4.执行SQL语句 
        Object count = queryRunner.query(sql, new ScalarHandler());
        System.out.println("查询总条数: " + count);
        
    }

6.4. 小结

  1. 步骤
  • 创建QueryRunner() 对象传入DataSource
  • 调用query(sql,ResultSetHandler, params…)
  1. ResultSetHandler
  • BeanHandler() 查询一条记录封装到JavaBean对象
  • BeanListHandler() 查询多条记录封装到Listlist
  • MapHandler() 查询一条记录封装到Map对象
  • MapListHandler() 查询多条记录封装到List
  • ScalarHandler() 封装单个记录的 eg:统计数量
  1. 注意实现 封装到JavaBean条件, 查询出来的数据的列名必须和JavaBean属性一致