重拾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
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值