1、DBUtils是什么
为了更加简单地使用JDBC,Apache组织提供了一个DBUtils工具,它是操作数据库的一个组件,实现了对JDBC的简单封装,可以在不影响数据库访问性能的情况下简化JDBC的编码工作量。DBUtils工具要有2个作用。
写数据,DBUtils可以通过编写SQL语句对数据表进行增、删、改操作。
读数据,DBUtils工具可以将从数据表中读取的数据结果集转换成Java常用类集合,以方便对结果进行处理。
2、DBUtils的核心类
DBUtils核心类库主要包括DBUtils类、QueryRunner类和ResultSetHandler接口。DBUtils工具主要通过这三个核心API进行JDBC的所有操作。
- QueryRunner类:用来执行sql语句
- DbUtils类:用来释放资源
- ResultSetHandler接口:用来接收查询的结果集
2.1、QueryRunner类
QueryRunner类简化了执行SQL语句的代码,它与ResultSetHandler配合就能完成大部分的数据库操作,大大减少了编码量。QueryRunner类提供了2个构造方法
构造方法 | 作用 |
QueryRunner() | 如果使用空参数构造方法创建对象,那么使用update方法和query方法时,必须传递conn对象 |
QueryRunner(DataSource ds) | 如果使用的是带连接池的构造方法,那么QueryRunnery类会自动的从连接池中获取conn对象 使用完毕会自动把conn对象归还给连接池 |
2.2、QueryRunner类的常用方法
QueryRunner主要提供了2个方法:
- 用来执行insert,update,delete语句的方法:update ,该方法返回int类型的值
- 用来执行select语句的方法:query 该方法返回对象或者集合
3.3、ResultSetHandler实现类
BeanHandler和BeanListHandler实现类是将结果集中的数据封装到对应的JavaBean中。在封装时,表中数据的字段和JavaBean的属性是相互对应的,一条数据记录被封装进一个对应的JavaBean对象中。BeanHandler和BeanListHandler的对比如下表所示。
3、增删改测试
3.1、数据准备
maven依赖
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
创建表,添加数据
-- ----------------------------
-- 创建部门表
-- ----------------------------
DROP TABLE IF EXISTS `tb_dept`;
CREATE TABLE `tb_dept` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '部门编号',
`dept_name` varchar(20) NOT NULL COMMENT '部门名称',
`dept_desc` varchar(200) DEFAULT NULL COMMENT '部门简介',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- 添加部门表数据
INSERT INTO `tb_dept` VALUES ('1', '研发部', '负责公司的产品研发工作');
INSERT INTO `tb_dept` VALUES ('2', '市场部', '负责市场推广和客户关系管理');
INSERT INTO `tb_dept` VALUES ('3', '销售部', '负责销售和客户关系维护');
INSERT INTO `tb_dept` VALUES ('4', '人力资源部', '负责招聘、培训和员工关系管理');
INSERT INTO `tb_dept` VALUES ('5', '财务部', '负责公司的财务管理和报表制作');
创在resources目录下添加c3p0-config.xml文件
<?xml version="1.0" encoding="utf-8" ?>
<c3p0-config>
<named-config name="testc3p0">
<!--指定链接数据源的基本属性-->
<!--驱动-->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<!--路径-->
<property name="jdbcUrl">
jdbc:mysql://localhost:3306/db_student
</property>
<!--用户名-->
<property name="user">root</property>
<!--密码-->
<property name="password">123456</property>
<!--连接池设置-->
<!--初始化连接的数量-->
<property name="initialPoolSize">20</property>
<!--最大有多少连接-->
<property name="maxPoolSize">40</property>
<!--当超出最大数量的时候,每次增加多少条连接-->
<property name="acquireIncrement">5</property>
<!--最少有多少连接-->
<property name="minPoolSize">10</property>
</named-config>
</c3p0-config>
添加实体类
public class Dept {
private int id;
private String dept_name;
private String dept_desc;
//省略getter setter
}
3.2、CURD测试
public class QueryRunnerInsertDemo {
ComboPooledDataSource dataSource;
QueryRunner qr;
//获取数据源
@Before
public void getDs(){
//获取数据源
dataSource = new ComboPooledDataSource("testc3p0");
//获取queryRunner对象
qr = new QueryRunner(dataSource);
}
//添加数据
@Test
public void addTest() throws SQLException {
//编写添加sql语句
String sql = "insert into tb_dept(dept_name,dept_desc) values(?,?)";
//调用更新方法
int row = qr.update(sql, "开发部", "需求变现");
System.out.println("受影响的行:"+row);
}
//修改
@Test
public void upTest() throws SQLException {
//编写添加sql语句
String sql = "update tb_dept set dept_name=?,dept_desc=? where id = ?";
//调用更新方法,传递参数
int row = qr.update(sql, "开发部","需求变现",1);
System.out.println("受影响的行:"+row);
}
//删除
@Test
public void delTest() throws SQLException {
//编写添加sql语句
String sql = "delete from tb_dept where id = ?";
//调用更新方法,传递参数
int row = qr.update(sql, 1);
System.out.println("受影响的行:"+row);
}
//通过Id查询数据
@Test
public void findById() throws SQLException {
//编写添加sql语句
String sql = "select * from tb_dept where id = ?";
//获取BeanHandle对象
BeanHandler<Dept> beanHandler = new BeanHandler<>(Dept.class);
//调用查询方法,传递参数
Dept dept = qr.query(sql, beanHandler,1);
System.out.println("对象:"+ dept);
}
//查询所有数据
@Test
public void findAll() throws SQLException {
//编写添加sql语句
String sql = "select * from tb_dept";
//获取BeanListHandle对象
BeanListHandler<Dept> beanListHandler = new BeanListHandler<>(Dept.class);
//调用查询方法
List<Dept> depts = qr.query(sql, beanListHandler);
System.out.println("集合:"+ depts);
}
}
查询左右运行结果: