相信很多人仍然在使用jdbc编程,尽管出现了很多像hibernate等这样的功能强大的数据持久层框架。最近在apache的网站上看到了一个对jdbc进行简单封装的组件包Dbutils,感觉挺好,向那些和我一样仍在使用jdbc编程的developer推荐一下。第一次翻译,水平有限,不足之处,尽请海涵。
原文地址:http://commons.apache.org/dbutils/
译文:
Dbutils 是一组类的集合,这组类可以使使用JDBC工作更加容易。Jdbc的资源清理代码是如此不堪,且容易出错,所以这些类从你的代码中分离出全部的清理任务,留给你的只有你想用jdbc做的工作:查询与更新。
使用dbutils的好处是:
·不可能资源泄露。正确的jdbc代码编写不困难,但是却十分的费时和繁琐。这经常导致连接泄露,而这又是很难跟踪的。
·精简代码,精简持久化代码。需要将数据持久化到数据库的这些代码锐减。没有了混乱的清理资源的代码,剩下的能很清楚的表达你的意思。
·从返回的结果集ResultSets,能自动填充javabean的属性。你不需要通过调用javabean的setter方法手工复制列的值到bean的实例中。结果集的每一行都能够被完全被bean的实例表达。
Dbutils 被设计为:
·精巧的-你能够在很短的时间内理解所有的包。
·透明的-dbutils不在幕后做任何魔术。你给他一次查询,它执行这次查询,然后为你做查询后的清理工作。
·快速的-你不需要创造百万个临时对象与dbutils一起工作。
Dbutils 不是:
·对象/关系桥梁-已经有大量的好的O/R工具。Dbutils是为使用jdbc的开发者准备的。
·数据访问对象(DAO)框架 – 但是dbutils能够被用来建立DAO框架。
·普通数据库对象比如表、列或者关键字的面向对象的抽象。
·任何一种重量级框架 – 这里的目标是一个直接而且容易使用的JDBC帮助库。
Dbutils:jdbc通用组件例子
本页提供了一些例子来展示dbutils可能如何被使用
基本使用
Dbutils是一个很小巧的类库,所以你不需要花很长时间来熟悉每个类的帮助文档。在dbutils中的核心类/接口是QueryRunner和ResultSetHandler。你不需要了解任何其它dbutils 类就能通过使用这个类库获益。下面这个例子演示了如何使用这些类。
// Create a ResultSetHandler implementation to convert the
// first row into an Object[].
ResultSetHandler h = new ResultSetHandler() {
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;
}
};
// Create a QueryRunner that will use connections from
// the given DataSource
QueryRunner run = new QueryRunner(dataSource);
// Execute the query and get the results back from the handler
Object[] result = (Object[]) run.query(
"SELECT * FROM Person WHERE name=?", "John Doe", h);
你也可以使用java.sql.Connection对象代替Datasource来处理上面例子中的查询,需要注意的是在这个例子中你需要显示关闭Connection
ResultSetHandler h = ... // Define a handler the same as above example
// No DataSource so we must handle Connections manually
QueryRunner run = new QueryRunner();
Connection conn = ... // open a connection
try{
Object[] result = (Object[]) run.query(
conn, "SELECT * FROM Person WHERE name=?", "John Doe", h);
// do something with the result
} finally {
// Use this helper method so we don't have to check for null
DbUtils.close(conn);
}