Loading

DButils的使用

DBUtils

如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,也可以采用apache commons组件一个成员:DBUtils。

DBUtils就是JDBC的简化开发工具包。需要项目导入commons-dbutils-1.6.jar才能够正常使用DBUtils工具。

概述

DBUtils是java编程中的数据库操作实用工具,小巧简单实用。DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

Dbutils主要有三个核心类

  • QueryRunner: 提供对sql语句操作的API.用于对数据库增删改查
  • ResultSetHandler接口:用于定义select操作后,怎样封装结果集,封装成javaBean
  • DbUtils:它就是一个工具类,定义了关闭资源与事务处理的方法

QueryRunner核心类介绍

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语句,并将查询结果封装到对象中。

可以看到提供数据源和提供连接着两种方式,他们唯一的区别在于函数的第一个参数需不需要加上连接(因为使用数据库连接池的方式,它的连接的获取是直接由数据源和DBUtlils来管理了)

QueryRunner实现添加、更新、删除操作

这里之所以不提到查找操作是因为查找的过程中涉及到查出了多个结果还是一个结果,是普通查找还是聚合查找,所以放在后半段单独讲

对于添加、更新、删除来说,每一个操作都有单独的方法,但是update方法三种操作都是通用的

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(C3P0Utils.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);
    }

三个操作的方式都是一样的,先创建一个QueryRunner对象,编写相应的sql语句,然后执行,在执行的update函数除了传入sql语句外,也传入占位符所对应的值

QueryRunner实现查询操作

查询操作的函数是下面这个

  • query(String sql, ResultSetHandler<T> rsh, Object... params) 用来完成表数据的查询操作

其中sql,params和上面的增删改一样,就是对应的sql语句和占位符的值,而ResultSetHandler<T> rsh则表示查询结果到java对象的一个映射关系

ResultSetHandler 结果集

  • BeanHandler:将结果集中第一条记录封装到一个指定的javaBean中。
  • BeanListHandler:将结果集中每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
  • ScalarHandler:它是用于单数据。例如select count(*) from 表操作。
  • ColumnListHandler:将结果集中指定的列的字段值,封装到一个List集合中

BeanHandler

/*
 * 查询数据表结果集处理其中一种方式:
 * BeanHandler处理方式
 *     将数据表的结果集第一行数据,封装成JavaBean类的对象
 * 构造方法:
 *     BeanHandler(Class<T> type) 
 *     传递一个Class类型对象,将结果封装到哪个类的对象
 */
@Test
public void demo01() throws SQLException{
    // 通过id查询详情,将查询结果封装到JavaBean product
    
    //1核心类 
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.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(C3P0Utils.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(C3P0Utils.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(C3P0Utils.getDataSource());
    String sql = "select * from product";
    List<String> list = queryRunner.query(sql, new ColumnListHandler<String>("pname"));

    System.out.println(list);
}
posted @ 2021-03-25 20:42  克豪  阅读(186)  评论(0)    收藏  举报