作者: 欢迎观看我的文章, 注定了我们今生有缘分! 我已从事Java开发教育十多年, 怀着教书育人的情怀, 正在让更多的同学们少走弯路, 改变千万IT人的命运!
期待同学动动你的小手给'霈哥'点赞、加关注、分享给更多的朋友共同学习交流, 每天持续更新离不开你的支持! 3Q
欢迎关注我的B站,可观看本文章配套视频~~~
欢迎关注我的公众号,获取更多资料~~~
学习目标
- 掌握DBUtils实现增删改
- 掌握DBUtils实现查询
第二章 DBUtils
如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils。
DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar
才能够正常使用DBUtils工具。
2.1 概述
DBUtils是java编程中的数据库操作实用工具,小巧简单实用。DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。
Dbutils三个核心功能介绍
-
QueryRunner中提供对sql语句操作的API.
-
ResultSetHandler接口,用于定义select操作后,怎样封装结果集.
-
DbUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法
2.2 准备数据
- 创建表:
create table product(
pid int primary key,
pname varchar(20),
price double,
category_id varchar(32)
);
- 插入表记录
INSERT INTO product(pid,pname,price,category_id) VALUES(1,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(2,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(3,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(4,'JACK JONES',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(5,'真维斯',200,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(6,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(7,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(8,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(9,'相宜本草',200,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(10,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(11,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(12,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(13,'果9',1,NULL);
2.3 QueryRunner核心类介绍
提供数据源
-
构造方法
QueryRunner(DataSource)
创建核心类,并提供数据源,内部自己维护Connection
-
普通方法
update(String sql , Object ... params)
执行DML语句query(String sql , ResultSetHandler , Object ... params)
执行DQL语句,并将查询结果封装到对象中。
提供连接
- 构造方法
QueryRunner()
创建核心类,没有提供数据源,在进行具体操作时,需要手动提供Connection
- 普通方法
update(Connection conn , String sql , Object ... params)
使用提供的Connection,完成DML语句query(Connection conn , String sql , ResultSetHandler , Object ... params)
使用提供的Connection,执行DQL语句,并将查询结果封装到对象中。
2.4 QueryRunner实现添加、更新、删除操作
update(String sql, Object... params)
用来完成表数据的增加、删除、更新操作
添加
// 插入数据
@Test
public void test1() throws SQLException {
//1. 获取 QueryRunnr对象, 这个用于执行 Sql语句
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行sql代码
String sql = "insert into product values(?,?,?,?)";
int line = qr.update(sql, 14, "康师傅方便面", 5, "c005");
//3. 处理查询结果数据 ( 如果是插入, 更新, 删除操作 没有必要做 步骤3)
System.out.println("line = " + line);
}
更新
// 更新数据
@Test
public void test2() throws SQLException {
//1. 获取 QueryRunnr对象, 这个用于执行 Sql语句
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
//2. 执行sql代码
String sql = "update product set pname=? , price=? where pid=?";
int line = qr.update(sql, "统一方便面", 4.5, 14);
//3. 处理查询结果数据 ( 如果是插入, 更新, 删除操作 没有必要做 步骤3)
System.out.println("line = " + line);
}
删除
// 删除数据
@Test
public void test3() throws SQLException {
QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
String sql = "delete from product where pid = ?";
int line = qr.update(sql, 14);
System.out.println("line = " + line);
}
2.5 QueryRunner实现查询操作
query(String sql, ResultSetHandler<T> rsh, Object... params)
用来完成表数据的查询操作
ResultSetHandler 结果集
-
BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中。
-
BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
-
ScalarHandler:它是用于单数据。例如select count(*) from 表操作。
-
ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中
JavaBean
JavaBean就是一个类,在开发中常用语封装数据。具有如下特性
-
需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。
-
提供私有字段:private 类型 字段名;
-
提供getter/setter方法:
-
提供无参构造
public class Product {
private int pid;
private String pname;
private Double price;
private String category_id;
//省略 getter和setter方法
}
BeanHandler
/*
* 查询数据表结果集处理其中一种方式:
* BeanHandler处理方式
* 将数据表的结果集第一行数据,封装成JavaBean类的对象
* 构造方法:
* BeanHandler<T>(Class<T> type)
* 传递一个Class类型对象,将结果封装到哪个类的对象呢
* Product类的Class对象
*/
@Test
public void demo01() throws SQLException{
// 通过id查询详情,将查询结果封装到JavaBean product
//1核心类
QueryRunner queryRunner = new QueryRunner(DruidUtils.getDataSource());
//2 sql语句
String sql = "select * from product where pid = ?";
//3 实际参数
Object[] params = {6};
//4 查询并封装
Product product = queryRunner.query(sql, new BeanHandler<Product>(Product.class), params);
System.out.println(product);
}
BeanListHandler
/*
* 查询数据表结果集处理其中一种方式:
* BeanListHandler处理方式
* 将数据表的每一行数据,封装成JavaBean类对象
* 多行数据了,多个JavaBean对象,存储List集合
*/
@Test
public void demo02() throws SQLException{
//查询所有,将每一条记录封装到一个JavaBean,然后将JavaBean添加到List中,最后返回List,BeanListHandler
QueryRunner queryRunner = new QueryRunner(DruidUtils.getDataSource());
String sql = "select * from product";
Object[] params = {};
List<Product> list = queryRunner.query(sql, new BeanListHandler<Product>(Product.class), params);
for(Product product : list){
System.out.println(product);
}
}
ScalarHander
/*
* 查询数据表结果集处理其中一种方式:
* ScalarHandler处理方式
* 处理单值查询结果,执行的select语句后,结果集只有1个
*/
@Test
public void demo03() throws SQLException{
// ScalarHandler : 用于处理聚合函数执行结果(一行一列)
// * 查询总记录数
QueryRunner queryRunner = new QueryRunner(DruidUtils.getDataSource());
String sql = "select count(*) from product";
Long obj = queryRunner.query(sql, new ScalarHandler<Long>());
//System.out.println(obj.getClass());
System.out.println(obj);
}
ColumnListHandler
/*
* 查询数据表结果集处理其中一种方式:
* ColumnListHandler处理方式
* 将查询数据表结果集中的某一列数据,存储到List集合
* 哪个列不清楚,数据类型也不清楚, List<Object>
* ColumnListHandler构造方法
* 空参数: 获取就是数据表的第一列
* int参数: 传递列的顺序编号
* String参数: 传递列名
*
* 创建对象,可以加入泛型,但是加入的数据类型,要和查询的列类型一致
*/
@Test
public void demo04() throws SQLException{
// ColumnListHandler : 查询指定一列数据
QueryRunner queryRunner = new QueryRunner(DruidUtils.getDataSource());
String sql = "select * from product";
List<String> list = queryRunner.query(sql, new ColumnListHandler<String>("pname"));
System.out.println(list);
}
2.6 小结
DBUtils工具
- 作用:简化JDBC的操作
DBUtils常用类与方法
-
QueryRunner构造方法
-
QueryRunner(DataSource)
创建核心类,并提供数据源,内部自己维护Connection
QueryRunner()
创建核心类,没有提供数据源,在进行具体操作时,需要手动提供Connection
-
-
QueryRunner 用来执行SQL语句对象
update(String sql , Object ... params)
执行DML语句update(Connection conn, String sql, Object… params)
插入表记录、更新表记录、删除表记录query(String sql , ResultSetHandler , Object ... params)
执行DQL语句,并将查询结果封装到对象中。query(Connection conn, String sql, ResultSetHandler handler, Object… params)
查询表记录
-
ResultSetHandler 处理结果集的对象
- BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中。
BeanHandler<Product>(Product.class) --> Proudct
- BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
BeanListHandler<Product>(Product.class) --> List<Product>
- ScalarHandler:它是用于单数据。例如select count(*) from 表操作。
ScalarHandler<Long>() --> Long
- ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中
ColumnListHandler<String>("pname") --> List<String>
- BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中。