zoukankan      html  css  js  c++  java
  • Commons DbUtils

    1       概述

    Commons DBUtils类库是小型的设计于易于使用JDBC的类集合。JDBC资源清理是平凡的,容易出错,以至于这些类从你的代码中抽象出清理代码,剩下你最初真正想要使用JDBC做的代码:查询和更新数据。

    使用DBUtils的一些优势:

    • 没有资源泄露的可能性。正确的JDBC编码并不难,但它耗时且乏味。这常常会导致连接泄漏可能很难追踪。

    • 清晰的持久化代码。需要持久化数据到数据库中的代码大幅减少。剩下的代码清晰的表达你的意图没有凌乱的资源清理。

    • 从ResultSet自动填充JavaBean。你不需要通过setter方法手动复制列值到bean实例。ResultSet的每行代表一个完全填充的bean实例。

    2       包的范围

    DBUtils设计为:

    • 小巧——你应该能够在很短的时间理解整个包。

    • 透明——DbUtils不在背后做任何魔术。你指定给它一个查询,它执行查询并为你清理。

    • 快速——你不需要创建一百万个临时对象使用DbUtils。

    DbUtils不是:

    • 一个对象/关系桥——有很多好的O/R工具。DbUtils是为想要使用JDBC开发人员设计。

    • 一个数据访问对象(DAO)框架——DbUtils能用于构建一个DAO框架。

    • 面向对象的通用数据库对象的抽象,像Table、Column或PrimaryKey。

    • 任意种类的重量级框架——目标是一个简单的和易于使用的JDBC辅助库。

    3       示例

    3.1         基本使用

    DbUtils是非常小的类库,因此它不需要花很长时间去遍历每个类的APIs。DbUtils的核心类或接口是QueryRunner和ResultSetHandler。你不需要知道关于每个其它的DbUtils类。以下例子演示如何使用这些类。

    // 创建一个ResultSetHandler实现转换第一行为一个Object[]
    ResultSetHandler<Object[]> h = new ResultSetHandler<Object[]>() {
        public Object[] handle(ResultSet rs) throws SQLException {
            if (!rs.next()) {
                return null;
            }
        
            ResultSetMetaData meta = rs.getMetaData();
            int cols = meta.getColumnCount();
            Object[] result = new Object[cols];
    
            for (int i = 0; i < cols; i++) {
                result[i] = rs.getObject(i + 1);
            }
    
            return result;
        }
    };
    
    // 创建一个QueryRunner将使用指定DataSource的连接
    QueryRunner run = new QueryRunner(dataSource);
    
    // 执行查询并获取处理器返回的结果
    Object[] result = run.query("SELECT * FROM Person WHERE name=?", 
    h, "John Doe");

    你也能使用java.sql.Connection对象执行前面的查询而不是一个DataSource。注意,你负责关闭Connection。

    ResultSetHandler<Object[]> h = ... // 和上面一样定义一个处理器
     // 没有DataSource,因此我们必须手动处理连接QueryRunner run = new QueryRunner();
     
     Connection conn = ... // 打开一个连接
     try{
         Object[] result = run.query(
             conn, "SELECT * FROM Person WHERE name=?", h, "John Doe");
             // 使用结果
             
     } finally {
         // 使用该辅助方法,因此我们不需要检查null    DbUtils.close(conn);  
     }

    你不仅能从数据库抓取数据——你也能插入或更新数据。以下示例将首先插入一条person记录到数据库然后改变person的身高。

    QueryRunner run = new QueryRunner( dataSource );
     try {
         // 执行SQL更新语句并返回我们插入的数量
         int inserts = run.update( "INSERT INTO Person (name,height) VALUES (?,?)",
                                   "John Doe", 1.82 );
         // 使用可变参数和自动装箱来简化代码
         int updates = run.update( "UPDATE Person SET height=? WHERE name=?",
                                   2.05, "John Doe" );
     } catch(SQLException sqle) {
         // 处理它
     }

    对于长时间运行调用你能使用AsyncQueryRunner执行异步调用。AsyncQueryRunner类有与QueryRunner相同的方法;然而,方法返回一个Future。

    ExecutorService service = Executors.newCachedThreadPool();
    AsyncQueryRunner asyncRun = new AsyncQueryRunner(service);
    Connection conn = …
    try {
        // 创建一个更新调用的Callable
        Future<Integer> = asyncRun.update(conn, "UPDATE Person SET height=? WHERE name=?",
             2.05, "John Doe" );
        // 执行
        f.get();
    } catch(SQLException sqle) {
        // 处理异常
    }

    3.2         ResultSetHandler实现

    在上面的例子中,我们实现ResultSetHandler接口把ResultSet的第一行转换为Object[]。这是一个相当通用可以跨多个项目重用的实现。DbUtils意识到了这一点,在org.apache.commons.dbutils.handlers包中提供一组ResultSetHandler实现执行常见的转换为数组、Map和JavaBeans。每个实现有一个版本只转换ResultSet中的第一行和其它转换ResultSet中的所有行。

    我们将开始一个例子,使用BeanHandler从ResultSet中抓取每一行,并转换到JavaBean中。

    QueryRunner run = new QueryRunner(dataSource);
    
    // 使用BeanHandler实现转换ResultSet的第一行为一个Person JavaBean
    ResultSetHandler<Person> h = new BeanHandler<Person>(Person.class);
    
    // 使用一个占位符参数执行SQL语句并返回BeanHandler产生的新Person对象的结果
    Person p = run.query("SELECT * FROM Person WHERE name=?", h, "John Doe");

    此时,我们将使用BeanListHandler从ResultSet抓取所有行并转换它们到一个JavaBeans的List中。

    QueryRunner run = new QueryRunner(dataSource);
     
    // 使用BeanListHandler实现转换ResultSet的所有行到Person JavaBeans的List中
    ResultSetHandler<List<Person>> h = new BeanListHandler<Person>(Person.class);
     
    // 执行SQL语句并返回BeanListHandler产生的Person对象的List结果
    List<Person> persons = run.query("SELECT * FROM Person", h);

    3.3         自定义RowProcessor

    每个提供的ResultSetHandler实现接收一个RowProcessor做实际的行到对象的转换。默认处理器使用BasicRowProcessor实现,但你能实现自定义版本的插件。也许最常见的自定义是实现toBean()方法处理自定义数据库数据类型问题。

    3.4         自定义BeanProcessor

    BasicRowProcessor使用一个BeanProcessor转换ResultSet列到JavaBean属性。你能在子类中覆盖处理步骤处理针对你的应用程序的数据类型映射。提供实现代表数据类型转换为JDBC驱动程序。

    BeanProcessor映射列到bean属性记录在BeanProcessor.toBean()的javadoc中。列名必须匹配bean的属性名(忽略大小写)。例如,firstname列可以通过调用bean的setFirstName()方法存储。然而,许多数据库列名包括字符要么不能使用要么不是通常用于Java方法的名字。你能映射这些列到bean属性:

    • 在SQL中的列别名,所以它们能匹配Java名称:select social_sec# as socialSecurityNumber from person

    • 实现BeanProcessor并覆盖mapColumnsToProperties()方法剔除攻击性字符。

  • 相关阅读:
    OC内存管理
    摘要算法
    加密算法
    编码技术
    Golang遇到的一些问题总结
    SignalR
    uni-app 小程序 vue
    C# 调用 C++ dll的两种方式
    Vue 项目 VSCode 调试
    Navicat 导出 表结构
  • 原文地址:https://www.cnblogs.com/chenkeyu/p/8592165.html
Copyright © 2011-2022 走看看