重拾JDBC(十五)Apache的DBUtils框架学习

Apache的DBUtils框架学习

http://www.cnblogs.com/xdp-gacl/p/4007225.html

一、commons-dbutils简介

commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

commons-dbutilsAPI介绍:

  • org.apache.commons.dbutils.QueryRunner
  • org.apache.commons.dbutils.ResultSetHandler

工具类

  • org.apache.commons.dbutils.DbUtils

二、QueryRunner类使用讲解

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

QueryRunner类提供了两个构造方法:

  • 默认的构造方法
  • 需要一个 javax.sql.DataSource 来作参数的构造方法。

2.1、QueryRunner类的主要方法

  1. public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) throws SQLException:执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。

  2. public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException: 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。

  3. public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException : 执行一个不需要置换参数的查询操作。返回值取决于ResultSetHandler的handle方法的返回值

  4. public int update(Connection conn, String sql, Object[] params) throws SQLException:用来执行一个更新(插入、更新或删除)操作。

  5. public int update(Connection conn, String sql) throws SQLException:用来执行一个不需要置换参数的更新操作。

2.2、使用QueryRunner类实现CRUD

使用该类库需要导入commons-dbutils-1.7.jar

更新操作:

//使用默认构造器,QueryRunner是线程安全的
QueryRunner qr = new QueryRunner();

@Test
public void testUpdate() {

    Connection connection = null;

    try {
        connection = JdbcUtils_c3p0.getConnection();

        String sql = "update name set name = ?"
                + "where id=?";

        //只需要获取数据库连接,返回值为更新的行数
        qr.update(connection, sql, "gujiaming",1);

    }catch (Exception e) {
        e.printStackTrace();
    }finally {
        JdbcUtils_c3p0.release(connection, null, null);
    }
}

查询操作:

@Test
public void testQuery() {
    Connection connection = null;

    try {
        connection = JdbcUtils_c3p0.getConnection();

        String sql = "select id,name "
                + "from  name";
        //这个方法的返回集是根据ResultSetHandle实现类来进行处理的
        List<Name> nameList = qr.query(connection, sql,new MyResultSetHandler());
        System.out.println("nameList:" + nameList.toString());
    }catch (Exception e) {
        e.printStackTrace();
    }finally {

    }
}

/**
 * 内部类,实现ResultSetHandler,对查询结果集进行处理
 * @author i-scream
 *
 */
class MyResultSetHandler implements ResultSetHandler<List<Name>>{

    @Override
    public List<Name> handle(ResultSet rs) throws SQLException {
        List<Name> names = new ArrayList<>();
        while(rs.next()) {
            Long id = rs.getLong(1);
            String name = rs.getString(2);
            Name rsName = new Name(id, name);
            names.add(rsName);
        }
        return names;
    }

}

打印结果:

nameList:[Name [id=1, name=gujiaming]]

三、ResultSetHandler接口使用讲解

该接口用于处理java.sql.ResultSet,将数据按要求转换为另一种形式。

实现ResultSetHandler接口必须实现handle方法:Object handle (java.sql.ResultSet rs)

3.1、ResultSetHandler接口的实现类

  • BeanHandler:将结果集中的第一行数据封装到一个对应的JavaBean实例中。
  • BeanListHandler:将结果集中的每一行数据都封装到一个对应的JavaBean实例中,存放到List里。
  • MapHandler:将结果集中的第一行数据封装到一个Map里,key是列名,value就是对应的值。
  • MapListHandler:将结果集中的每一行数据都封装到一个Map里,然后再存放到List
  • ArrayHandler:把结果集中的第一行数据转成对象数组。
  • ArrayListHandler:把结果集中的每一行数据都转成一个数组,再存放到List中。
  • ColumnListHandler:将结果集中某一列的数据存放到List中。
  • KeyedHandler(name):将结果集中的每一行数据都封装到一个Map里,再把这些map再存到一个map里,其key为指定的key。

    /**

    • BeanHandler: 把结果集的第一条记录转为创建 BeanHandler 对象时传入的 Class
    • 参数对应的对象.
      */
      @Test
      public void testBeanHanlder(){
      Connection connection = null;

      try {
      connection = JDBCTools.getConnection();
      String sql = “SELECT id, name customerName, email, birth ” +
      “FROM customers WHERE id >= ?”;

      Customer customer = queryRunner.query(connection, 
              sql, new BeanHandler(Customer.class), 5);
      
      System.out.println(customer);
      

      } catch (Exception e) {
      e.printStackTrace();
      } finally{
      JDBCTools.releaseDB(null, null, connection);
      }
      }

    /**

    • BeanListHandler: 把结果集转为一个 List, 该 List 不为 null, 但可能为
    • 空集合(size() 方法返回 0)
    • 若 SQL 语句的确能够查询到记录, List 中存放创建 BeanListHandler 传入的 Class
    • 对象对应的对象.
      */
      @Test
      public void testBeanListHandler(){
      Connection connection = null;

      try {
      connection = JDBCTools.getConnection();
      String sql = “SELECT id, name, email, birth ” +
      “FROM customers”;

      List<Customer> customers = queryRunner.query(connection, 
              sql, new BeanListHandler(Customer.class));
      
      System.out.println(customers);
      

      } catch (Exception e) {
      e.printStackTrace();
      } finally{
      JDBCTools.releaseDB(null, null, connection);
      }
      }

    /**

    • MapHandler: 返回 SQL 对应的第一条记录对应的 Map 对象.
    • 键: SQL 查询的列名(不是列的别名), 值: 列的值.
      */
      @Test
      public void testMapHandler(){
      Connection connection = null;

      try {
      connection = JDBCTools.getConnection();
      String sql = “SELECT id, name, email, birth ” +
      “FROM customers”;

      Map<String, Object> result = queryRunner.query(connection, 
              sql, new MapHandler());
      
      System.out.println(result);
      

      } catch (Exception e) {
      e.printStackTrace();
      } finally{
      JDBCTools.releaseDB(null, null, connection);
      }
      }

    /**

    • MapListHandler: 将结果集转为一个 Map 的 List
    • Map 对应查询的一条记录: 键: SQL 查询的列名(不是列的别名), 值: 列的值.
    • 而 MapListHandler: 返回的多条记录对应的 Map 的集合.
      */
      @Test
      public void testMapListHandler(){
      Connection connection = null;

      try {
      connection = JDBCTools.getConnection();
      String sql = “SELECT id, name, email, birth ” +
      “FROM customers”;

      List<Map<String, Object>> result = queryRunner.query(connection, 
              sql, new MapListHandler());
      
      System.out.println(result);
      

      } catch (Exception e) {
      e.printStackTrace();
      } finally{
      JDBCTools.releaseDB(null, null, connection);
      }
      }

    /**

    • ScalarHandler: 把结果集转为一个数值(可以是任意基本数据类型和字符串, Date 等)返回
    • 默认返回第一列的值
      */
      @Test
      public void testScalarHandler(){
      Connection connection = null;

      try {
      connection = JDBCTools.getConnection();
      String sql = “SELECT name, email ” +
      “FROM customers”;

      Object result = queryRunner.query(connection, 
              sql, new ScalarHandler());
      
      System.out.println(result);
      

      } catch (Exception e) {
      e.printStackTrace();
      } finally{
      JDBCTools.releaseDB(null, null, connection);
      }
      }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值