DBUtils详解

DBUtils是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用DBUtils能极大简化JDBC编码的工作量,同时也不会影响程序的性能。

DBUtils三个核心功能:

QueryRunner类,提供对sql语句操作的API;

ResultSetHandler接口,用于定义select操作后,怎样封装结果集;

DbUtils类,它是一个工具类,定义了关闭资源与处理事务的方法。 

一、QueryRunner

使用QueryRunner类简化了SQL查询,它与ResultSetHandler组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。

构造QueryRunner,

 

QueryRunner中一共有6种方法:

  • execute(执行SQL语句)
  • batch(批量处理语句)
  • insert(执行INSERT语句)
  • insertBatch(批量处理INSERT语句)
  • query(SQL中 SELECT 语句)
  • update(SQL中 INSERT,UPDATE,或 DELETE 语句)

我们主要介绍最后两种(最常用):

1、query方法

 

query方法的重载形式有很多种,常用的有两种形式:

(1)T query(String sql, ResultSetHandler<T> rsh)  不需要替换参数来执行给定的SELECT语句

(2)T query(String sql, ResultSetHandler<T> rsh, Object... params)   需要一个或多个替换参数来执行给定的SELECT语句,并返回一种对象结果。

2、update方法

 

(1)int update(Connection conn, String sql)  不需要替换参数来执行INSERT,UPDATE,DELETE语句(参数还需要一个连接)

(2)int update(Connection conn, String sql, Object... params)  需要一个或多个替换参数以及一个数据库连接来执行INSERT,UPDATE,DELETE语句(参数还需要一个连接)

(3)int update(Connection conn, String sql, Object param)  需要一个替换参数,以及一个数据库连接来执行INSERT,UPDATE,DELETE语句(参数还需要一个连接)

(4)int update(String sql)  不需要替换参数来执行给定的INSERT,UPDATE,DELETE语句(参数无需带有连接)

(5)int update(String sql, Object... params)  需要一个或多个替换参数来执行INSERT,UPDATE,DELETE语句(参数无需带有连接)

(6)int update(String sql, Object param)  不需要替换参数来执行INSERT,UPDATE,DELETE语句(参数无需带有连接)

 

二、ResultSetHandler

对于结果集的处理有以下几个结果集处理器:

1、ScalarHandler

本方法是用于处理单行单列的数据,多用于聚合函数的查询。

但是,有一个点需要注意,就是当聚合函数是涉及到数字类型的时候,一定要注意返回值类型的转换。

有的人会选用Integer,long等类型,这些严格来说都是不合法的。例如,long类型最大只能容纳20的阶乘,21的阶乘就会包异常,所以我们要选用Number(这个是所有数据类型)的父类,并且对外提供的有Number.intValue()和Number.LongValue()等方法。

// 名字的第一个
public void testScalarHandler() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select name from tb_user where id =?";
    Object object = queryRunner.query(sql, new ScalarHandler(), 1);
    System.out.println(object.toString());
}

// 名字的第一个
public void testScalarHandler1() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user where id =?";
    Object object = queryRunner.query(sql, new ScalarHandler("name"), 1);
    System.out.println(object.toString());
}

// 第二列的第一个
public void testScalarHandler2() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user where id =?";
    Object object = queryRunner.query(sql, new ScalarHandler(2), 1);
    System.out.println(object.toString());
}

// 获取数据库中总共有多少条数据 (单行单列)
public void testCount() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select count(*) from tb_user";
    Number num = (Number) queryRunner.query(sql, new ScalarHandler());
    System.out.println(num.intValue());
}

2、BeanHandler

将结果集中的第一行数据封装到一个对应的JavaBean实例中。

本方法多用于在处理把单行结果集封装成JavaBean对象(对象时通过反射完成创建的)

public void testBeanHandler() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user where id =?";
    User user = queryRunner.query(sql, new BeanHandler<User>(User.class), 1);
    System.out.println(user.toString());
}

3、BeanListHandler

将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。

public void testBeanListHandler() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user";
    List<User> list = queryRunner.query(sql, new BeanListHandler<User>(User.class));
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i).toString());
    }
}

 

4、BeanMapHandler

将结果集中的每一行数据都封装到一个JavaBean里,再把这些JavaBean再存到一个Map里,其key为指定的列。

public void testBeanMapHandler() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user";
    Map<String, User> map = queryRunner.query(sql, new BeanMapHandler<String, User>(User.class, "name"));
    for (Map.Entry<String, User> entry : map.entrySet()) {
        System.out.println(entry.getKey() + " : " + entry.getValue());
    }
}

5、MapHandler

将结果集中的第一行数据封装到一个Map里,key是表中的列名,value就是对应的值。

public void testMapHandler() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user where id =?";
    // map中键是列名 ,值是列所对应的值
    Map<String, Object> map = queryRunner.query(sql, new MapHandler(), 1);
    for (Map.Entry<String, Object> m : map.entrySet()) {
        System.out.println(m.getKey() + " = " + m.getValue());
    }
}

6、MapListHandler

将结果集中的每一行数据都封装到一个Map里,然后再存放到List中。

public void testMapListHandler() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user";
    List<Map<String, Object>> list = queryRunner.query(sql, new MapListHandler());
    for (int i = 0; i < list.size(); i++) {
        Map<String, Object> map = list.get(i);
        System.out.println(i + "====");
        for (Map.Entry<String, Object> m : map.entrySet()) {
            System.out.println(m.getKey() + " = " + m.getValue());
        }
    }
}

7、ColumnListHandler

将结果集中某一列的数据存放到List中。

public void testColumnListHandler1() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select name from tb_user";
    List<String> list = queryRunner.query(sql, new ColumnListHandler<String>());
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i).toString());
    }
}

public void testColumnListHandler2() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user";
    // 列的index从1开始
    List<String> list = queryRunner.query(sql, new ColumnListHandler<String>(2));
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i).toString());
    }
}

public void testColumnListHandler3() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user";
    List<String> list = queryRunner.query(sql, new ColumnListHandler<String>("name"));
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i).toString());
    }
}

8、ArrayHandler

把结果集中的第一行数据转成对象数组。

public void testArrayHandler() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user where id =?";
    Object[] objects = queryRunner.query(sql, new ArrayHandler(), 1);
    for (int i = 0; i < objects.length; i++) {
        System.out.println(objects[i].toString());
    }
}

9、ArrayListHandler

把结果集中的每一行数据都转成一个对象数组,再存放到List中。

public void testArrayListHandler() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user";
    List<Object[]> list = queryRunner.query(sql, new ArrayListHandler());
    for (int i = 0; i < list.size(); i++) {
        Object[] objects = list.get(i);
        System.out.println(i + "===");
        for (int j = 0; j < objects.length; j++) {
            System.out.println(objects[j].toString());
        }
    }
}

10、KeyedHandler

将结果集中的每一行数据都封装到一个Map里,再把这些Map再存到一个Map里,其key为指定的列。

public void KeyedHandler() throws SQLException {
    QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
    String sql = "select * from tb_user";
    // 查询结果:把每一条查到的结果封装到map中,把这条数据对应的列名当作map的key存储,把这条数据对应的列的值当作map的value存储,
    // 再把每一条的数据的map存入到另一个大map中,把该条数据的唯一标识id当作key存储,这条数据的map当作大map的value存储。
    Map<Integer, Map<String, Object>> map = queryRunner.query(sql, new KeyedHandler<Integer>("id"));
    for (Map.Entry<Integer, Map<String, Object>> m : map.entrySet()) {
        Integer id = m.getKey();
        System.out.println(id + ":"); // 每一条数据的id
        Map<String, Object> m1 = m.getValue();
        for (Map.Entry<String, Object> m2 : m1.entrySet()) {
            // key:列名, value:列的值
            System.out.println(m2.getKey() + " = " + m2.getValue());
        }
    }
}

 

posted @ 2022-05-03 20:47  熊猫Panda先生  阅读(2107)  评论(0编辑  收藏  举报