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;//获取数据源@Beforepublic void getDs(){//获取数据源dataSource = new ComboPooledDataSource("testc3p0");//获取queryRunner对象qr = new QueryRunner(dataSource);}//添加数据@Testpublic 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);}//修改@Testpublic 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);}//删除@Testpublic void delTest() throws SQLException {//编写添加sql语句String sql = "delete from tb_dept where id = ?";//调用更新方法,传递参数int row = qr.update(sql, 1);System.out.println("受影响的行:"+row);}//通过Id查询数据@Testpublic 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);}//查询所有数据@Testpublic 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);}
}
查询左右运行结果: