MySQL实战系列 -- 7. DBUtils

362 阅读7分钟

作者: 欢迎观看我的文章, 注定了我们今生有缘分! 我已从事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就是一个类,在开发中常用语封装数据。具有如下特性

  1. 需要实现接口:java.io.Serializable ,通常实现接口这步骤省略了,不会影响程序。

  2. 提供私有字段:private 类型 字段名;

  3. 提供getter/setter方法:

  4. 提供无参构造

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>