JDBC - 学习8 - Apache-DBUtil类库的使用

10 篇文章 0 订阅

1. 介绍

介绍: 简单的封装JDBC,简化JDBC编程的工作量,不会影响程序的性能

执行SQL,可处理结果集,线程安全
将结果集转为其他对象
关闭资源、提交回滚,加载驱动
常用的三个接口
org.apache.commons.dbutils.QueryRunner
org.apache.commons.dbutils.ResultSetHandler
org.apache.commons.dbutils.DbUtils

2. QueryRunner

2.1 更新操作 - 增删改

  QueryRunner.update( Connection conn, String sql, Object… params )

@Test
public void testInsert() throws Exception {

    QueryRunner qRunner = new QueryRunner();

    Connection conn = ConnectionTest.getConnection5();

    String sql = "update imgTable set money = money + 100 where name = ?";

    Integer rowCount = qRunner.update(conn, sql, 2);

    conn.close();

    System.out.println(rowCount);
}

2.2 查询操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CUx1ZTfI-1574126523609)(en-resource://database/9891:1)]

2.2.1 单条记录查询 - BeanHandler

将结果集的每一个结果转为 JavaBean对象

  

  QureyRunner.query( Connection conn, String sql, ResultSetHandler rsh, Object… params )

@Test
public void testSelect1() throws Exception {
    QueryRunner qRunner = new QueryRunner();

    Connection conn = ConnectionTest.getConnection5();

    String sql = "select * from emp where empno in (?)";

    Object[] params = { 1113 };
    
    // 2. 数据集的处理 -- query的返回类型跟泛型参数有关
    ResultSetHandler<Emp> rsh = new BeanHandler<Emp>(Emp.class);

    Emp emp = qRunner.query(conn, sql, rsh, params);

    System.out.println(emp);

    conn.close();
}


  运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wMuQoKQo-1574126523629)(en-resource://database/9893:1)]

2.2.2 多条记录查询 - BeanListHandler

将结果集的每一个结果转为 JavaBean对象,并将JavaBean对象存入到ArrayList容器中

  QureyRunner.query( Connection conn, String sql, ResultSetHandler rsh, Object… params )

@Test
public void testSelect2() throws Exception {
    QueryRunner qRunner = new QueryRunner();

    Connection conn = ConnectionTest.getConnection5();

    String sql = "select * from emp where empno in (?, ?, ?)";
    Object[] params = { 1113, 1111, 7654 };

    BeanListHandler<Emp> blh = new BeanListHandler<Emp>(Emp.class);

    List<Emp> list = qRunner.query(conn, sql, blh, params);

    list.forEach(System.out::println);

    DbUtils.close(conn);

}


  运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fn2HS4Nc-1574126523632)(en-resource://database/9895:1)]

2.2.3 用于查询特殊值的单行函数 - ScalarHandler
@Test
public void testSelect5() throws Exception {
    Connection conn = ConnectionTest.getConnection5();

    String sql = "select count(*) from emp";

    Object[] params = {};

    ResultSetHandler<Object> rsh = new ScalarHandler<Object>();

    QueryRunner qRunner = new QueryRunner();

    Object query = qRunner.query(conn, sql, rsh, params);

    System.out.println(query);

    conn.close();
}


  运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1YEwAIM1-1574126523635)(en-resource://database/9897:1)]

2.2.4 自定义结果集的处理器
@Test
public void testSelect6() throws Exception{
    Connection conn = ConnectionTest.getConnection5();

    String sql = "select * from emp where empno=1113";

    Object[] params = {};
    
    // 1. 实现ResultSetHandler接口的匿名类  --- 只要实现一个接口方法即可
    ResultSetHandler<Emp> rsh = new ResultSetHandler<Emp>() {
        @Override
        public Emp handle(ResultSet rs) throws SQLException {
            Emp emp = null;
            ResultSetMetaData metaData = rs.getMetaData();
            Integer columnCount = metaData.getColumnCount();

            if(rs.next()) {
                emp = new Emp();
                Class<Emp> empClass = (Class<Emp>)emp.getClass();
                for( int i = 0; i < columnCount; i++) {

                    String columnName = (metaData.getColumnName(i+1)).toLowerCase();

                    String methodName = "set" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1);


                    if(columnName.equals("hiredate")) {
                        continue;
                    }

                    Object value = rs.getObject(columnName);

                    if(value instanceof BigDecimal) {
                        value = ((BigDecimal)value).intValue();
                        try {
                            Method method = empClass.getDeclaredMethod(methodName, value.getClass());
                            method.invoke(emp, (Integer)value);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (value instanceof String) {
                        try {
                            Method method = empClass.getDeclaredMethod(methodName, value.getClass());
                            method.invoke(emp, (String)value);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                }
            }

            return emp;
        }
    };

    QueryRunner qRunner = new QueryRunner();

    Object query = qRunner.query(conn, sql, rsh, params);

    System.out.println(query);

    conn.close();

}


  运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gNAYbr8R-1574126523640)(en-resource://database/9899:1)]

2.2.5 单条记录查询 - MapHandler
@Test
public void testSelect3() throws Exception {

    Connection conn = ConnectionTest.getConnection5();

    String sql = "select * from emp where empno = 1111";

    Object[] params = {};

    ResultSetHandler<Map<String, Object>> rsh = new MapHandler();

    QueryRunner qRunner = new QueryRunner();

    Map<String, Object> mapEmp = qRunner.query(conn, sql, rsh, params);

    System.out.println(mapEmp);

    conn.close();

}


  运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sw6AZ6HX-1574126523648)(en-resource://database/9903:1)]

2.2.6 多条记录查询 - MapListHandler
@Test
public void testSelect4() throws Exception {
    Connection conn = ConnectionTest.getConnection5();

    String sql = "select * from emp";

    Object[] params = {};

    ResultSetHandler<List<Map<String, Object>>> rsh = new MapListHandler();

    QueryRunner qRunner = new QueryRunner();

    List<Map<String, Object>> query = qRunner.query(conn, sql, rsh, params);

    query.forEach(System.out::println);

    conn.close();
}


  运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZSA906da-1574126523653)(en-resource://database/9901:1)]

2. DbUtils

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vFyzXGOf-1574126523656)(en-resource://database/9907:1)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值