Apache-DBUtils工具简介

Apache DBUtils是一个简化JDBC编码工作的工具,类似于Hibernate,它能有效防止资源泄露、简化代码并自动映射ResultSet到JavaBean。核心类QueryRunner支持多种数据库操作,包括批量处理及事务管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Apache-DBUtils工具简介

作用:简化jdbc编码的工作量, 类似于Hibernate

使用这个DbUtils的一些优势:
1. 防止了资源的泄露,写一段JDBC的准备代码其实并不麻烦,但是那些操作确实是十分耗时和繁琐的,也会导致有时候数据库连接忘记关闭了导致异常难以追踪。
2. 干净整洁的持久化代码,把数据持久化到数据库的代码被打打削减,剩下的代码能够清晰简洁的表达你的操作目的。
3. 自动把ResultSets中的工具映射到JavaBean中,你不需要手动的使用Setter方法将列值一个个赋予相应的时日,Resultset中的每一个行都大表一个完成的Bean实体。

使用核心

  • 核心类:QueryRunner ; 该类提供了query()和update()方法的多种重载形式。
    –>对于这两种方法,存在接收Connection参数的形式,这是为了支持事务, 对于不接收Connection的形式,会自动在链接上发送sql,并提交事务后,将链接返回给数据源
  • QueryRunner类,还提供了batch()方法,
  • 提供很多ResultSetHandler的实现类

如何使用

  1. 创建QueryRunner对象
    QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
    NT:参数接收的是数据源,以便QueryRunner得到链接, 这里直接贴出了工具类,数据源可以使用dbcp、c3p0什么的都可以

  2. 执行需要的动作(CRUD)

    @Test
    public void insert() throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";
        Object params[] = {2,"bbb","123","aa@sina.com",new Date()};
        runner.update(sql, params);
    }

    @Test
    public void update() throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "update users set email=? where id=?";
        Object params[] = {"aaaaaa@sina.com",1};
        runner.update(sql, params);
    }

    @Test
    public void delete() throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "delete from users where id=?";
        runner.update(sql, 1);
    }

    @Test
    public void batch() throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql =  "insert into users(id,name,password,email,birthday) values(?,?,?,?,?)";
        Object params[][] = new Object[3][5];
        for(int i=0;i<params.length;i++){  //3
            params[i] = new Object[]{i+1,"aa"+i,"123",i + "@sina.com",new Date()};
        }
        runner.batch(sql, params);
    }

对于查询,那就是重头戏了:
从数据库中查询数据,我们当然会得到查询结果啦。
为了按我们的需求获得我们的查询结果,DBUtils框架为我们提供了接口:
例如这个方法: Object query(String sql, Object[] params, ResultSetHandler rsh)
ResultSetHandler就是一个接口, 我们可以实现这个接口,并复写 Object handle(ResultSet rs) 方法, 按照我们自己的需求处理结果。
不过我们自己写那多麻烦,DBUtils为我们提供一些ResultSetHandler的实现类,这些类实现了将结果封装到bean、集合等。
例如 BeanHandler:

    @Test
    //将查询结果,封装到bean中,我们只需要将bean的class传给Handler即可
    public void find() throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "select * from users where id=?";
        User user = (User) runner.query(sql, 1, new BeanHandler(User.class));
        System.out.println(user.getEmail());
    }

其他的ResultSetHandler还有:
ArrayHandler、 ArrayListHandler、BeanListHandler、
ColumnListHandler:将结果集中某一列的数据封装到list中
KeyedHandler: 将结果集中的每一行数据都封装到一个Map里,再把这些数据存到一个map里,其key为指定的key
MapHandler:将结果中的第一行数据封装到一个mapli,key是列名,value是值。
MapListHandler
ScalarHandler:将某一列数据转到一个对象中

    @Test
    public void test1() throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "select * from users";
        Object result[] = (Object[]) runner.query(sql, new ArrayHandler());
        System.out.println(result[0]);
        System.out.println(result[1]);
    }


    @Test
    public void test2() throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "select * from users";
        List list = (List) runner.query(sql, new ArrayListHandler());
        System.out.println(list);
    }

    @Test
    public void test3() throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "select * from users";
        List list = (List) runner.query(sql, new ColumnListHandler1("name"));
        System.out.println(list);
    }


    @Test
    public void test4() throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "select * from users";
        Map<Integer,Map<String,Object>> map = (Map) runner.query(sql, new KeyedHandler("id"));

        for(Map.Entry<Integer,Map<String,Object>> me : map.entrySet()){
            int id = me.getKey();
            for(Map.Entry<String, Object> entry : me.getValue().entrySet()){
                String name = entry.getKey();
                Object value = entry.getValue();
                System.out.println(name + "=" + value);
            }
        }
    }

    @Test
    public void test5() throws SQLException{
        QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());
        String sql = "select count(*) from users";
        //Object result[] = (Object[]) runner.query(sql, new ArrayHandler());
        /*long totalrecord = (Long)result[0];
        int num = (int)totalrecord;
        System.out.println(num);
        int totalrecord = ((Long)result[0]).intValue();
        */

        int totalrecord = ((Long)runner.query(sql, new ScalarHandler(1))).intValue();
        System.out.println(totalrecord);
    }

dbUtils事务管理

使用dbUtils处理事务,也很简单
1. 在new QueryRunner对象时,不要传给它数据源,即,链接我们自己获得。

    QueryRunner runner = new QueryRunner();
  1. 在使用QueryRunner.query() 或者 QueryRunner.update()。方法时使用带有Connection参数的重载形式,
    例如:
runner.update(JdbcUtils.getConnection(),sql, params);
    我们只需要不开启了事务的链接传递给它就OK了

NT:
我们自己获取的链接,不要忘记还给数据源,即调用close方法。
事务相关的注意事项也不要忘记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值