文档章节

Commons DbUtils

Leech
 Leech
发布于 2015/07/21 22:50
字数 1456
阅读 384
收藏 25

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框架。

  • 面向对象的通用数据库对象的抽象,像TableColumnPrimaryKey

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

3       示例

3.1         基本使用

DbUtils是非常小的类库,因此它不需要花很长时间去遍历每个类的APIsDbUtils的核心类或接口是QueryRunnerResultSetHandler。你不需要知道关于每个其它的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实现执行常见的转换为数组、MapJavaBeans。每个实现有一个版本只转换ResultSet中的第一行和其它转换ResultSet中的所有行。

我们将开始一个例子,使用BeanHandlerResultSet中抓取每一行,并转换到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");

此时,我们将使用BeanListHandlerResultSet抓取所有行并转换它们到一个JavaBeansList中。

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列可以通过调用beansetFirstName()方法存储。然而,许多数据库列名包括字符要么不能使用要么不是通常用于Java方法的名字。你能映射这些列到bean属性:

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

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

 

 


© 著作权归作者所有

共有 人打赏支持
上一篇: Java注解
下一篇: Commons之IO
Leech
粉丝 20
博文 196
码字总数 399079
作品 0
武汉
架构师
私信 提问
Apache Commons DbUtils 1.6 发布

Apache Commons DbUtils 1.6 发布,主要改进内容包括: ArrayHandler should return an empty array when handle has no rows Fixes DBUTILS-110. Order of columns not retained in BasicR......

oschina
2014/07/22
6.9K
15
DbUtils的网友评论

原则上这不能说是一个持久层框架,它提供了一些Jdbc的操作封装来简化数据查询和记录读取操作。本站就是采用这个项目来读写数据库,代码非常简洁,如果你厌烦了Hibernate的庞大,不妨可以试试...

红薯
2009/12/11
1K
12
修改DbUtils支持表名下划线映射(驼峰模式)

Commons DbUtils很一个很好用JDBC工具类,地球人都知道,就不介绍了,不知道的看这里:http://commons.apache.org/dbutils/ 在进行查询自动类映射的时候domain类的属性必须和数据库中名称一样...

Zero__One
2014/06/23
0
2
Apache Commons DbUtils 1.5 发布

DbUtils 可是难得更新一次啊,刚发布的 1.5 版本改进记录包括: Bug [DBUTILS-73] - .BasicRowProcessor.CaseInsensitiveHashMap uses default Locale for toLowerCase [DBUTILS-77] - "dro......

oschina
2012/07/22
4.3K
15
Apache Commons-DbUtils 1.4 发布

dbutils 1.4 发布了,dbutils 并不是一个严格意义上的 ORM 框架,它提供了一些Jdbc的操作封装来简化数据查询和记录读取操作。本站使用的就是 dbutils 这个工具包来进行数据库存取。 新版本主...

红薯
2011/10/25
3.1K
0

没有更多内容

加载失败,请刷新页面

加载更多

安装mysql8.0.11以及修改root密码、连接navicat for mysql。

安装mysql8.0.11以及修改root密码、连接navicat for mysql。   最近在学习node.js,少不得要跟数据库打交道,于是打算安装一个数据库软件,在mongedb和mysql之间选择了mysql。作为一个数据...

linjin200
6分钟前
0
0
前嗅ForeSpider教程:创建模板

今天,小编为大家带来的教程是:如何在前嗅ForeSpider中创建模板。主要内容有:模板的概念,模板的配置方式,模板的高级选项,具体内容如下: 一,模板的概念 模板列表的层级相当于网页跳转的...

forespider
8分钟前
0
0
OSChina 周三乱弹 —— 除了电脑,别人都很开心

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲,《三亩水田》- 蚂蚁先生 《三亩水田》- 蚂蚁先生 手机党少年们想听歌,请使劲儿戳(这里) @uknow8692 :感谢失业,让我...

小小编辑
10分钟前
137
11
django数据库自动重连

简介 Django数据库连接超过wait_timeout导致连接丢失时自动重新连接数据库 https://github.com/zhanghaofei/django-db-reconnect 安装 pip install django_db_reconnect 注意仅支持pymysql...

张豪飞
14分钟前
0
0
PostMan 工具使用使用,以及不同请求对应的ContentType 的设置

https://www.jianshu.com/p/d230d27b44fe

kuchawyz
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部