3. Apache-DBUtils实现CRUD操作
1. Apache-DBUtils简介
- commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。
1.1 DBUtils的常用API介绍
- 创建QueryRunner对象的API QueryRunner(DataSource ds) ,提供数据源(连接池),DBUtils底层自动维护连接connection
- 执行增删改的SQL语句的API int update(String sql, Object... params),执行增删改的SQL语句, params参数就是可变参数,参数个数取决于语句中问号的个数
- 执行查询的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 如下:
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
下载好的 jar 包如下:
image-20201028222511895
将 jar 包加入项目中,如下:
3.2 查看 DbUtils 的开发文档
下面我们首先来看看 QueryRunner 添加数据的更新方法,如下:
4.使用 Maven 设置 DBUtils 的 依赖
访问 https://mvnrepository.com/ 搜索 dbutils
<!-- https://mvnrepository.com/artifact/commons-dbutils/commons-dbutils -->
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
在项目的 pom.xml 中设置依赖,如下:
<!-- 设置依赖 -->
<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 步骤
- 创建QueryRunner()对象,传入dataSource
- 调用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 插入的示例
/**
* 使用 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 更新数据的示例
/**
* 使用 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 删除数据的示例
/**
* 使用 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 小结
- 创建QueryRuner()对象, 传入DataSource
- 调用update(String sql, Object...params)
6. 使用DBUtils完成查询
6.1 步骤
- 创建QueryRunner()对象 传入DataSource
- 调用query(sql, resultSetHandler,params)方法
6.2 ResultSetHandler结果集处理类介绍
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)
/**
* 查询一条数据封装到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)
/**
* 查询多条数据封装到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)
/**
* 查询一条数据,封装到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)
/**
* 查询多条数据,封装到`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())
/**
* 查询单个数据(使用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. 小结
- 步骤
- 创建QueryRunner() 对象传入DataSource
- 调用query(sql,ResultSetHandler, params…)
- ResultSetHandler
- BeanHandler() 查询一条记录封装到JavaBean对象
- BeanListHandler() 查询多条记录封装到Listlist
- MapHandler() 查询一条记录封装到Map对象
- MapListHandler() 查询多条记录封装到List
- ScalarHandler() 封装单个记录的 eg:统计数量
- 注意实现 封装到JavaBean条件, 查询出来的数据的列名必须和JavaBean属性一致