DbUtils是一个非常小的类库,所以不需要花费太长的时间来浏览javadocs中的每个类。DbUtils的核心的类/接口是 QueryRunner和ResultSetHandler。使用这个框架带来的好处是你不需要了解其它类的细节。下面的例子是介绍了如何将这些类一起使用。
//创建一个ResultSetHandle接口的实现来转换数据,将数据放进一个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;
}
};
//创建一个QueryRunner用来从被给定的数据源中连接。
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
。
注意在这个例子中,查询之后你要负责关闭连接。
ResultSetHandler h = ... // 用上面例子相同的方法定义一个handler
//没有数据源所以我们必须手动连接
QueryRunner run = new QueryRunner();
Connection conn = ... //打开一个连接
try{
Object[] result = (Object[]) run.query(
conn, "SELECT * FROM Person WHERE name=?", "John Doe", h);
// do something with the result
} finally {
//用这个帮助文件的方法DbUtils.close(),所以我们不必检测连接是否为空
DbUtils.close(conn);
}
ResultSetHandler接口的实现
在上面的例子中我们实现了ResultSetHandler接口将一行数据转换,送进了一个对象数组中。我们在很多项目中很清楚的实现这个接口。DbUtils提供了很多这种接口的实现,在这个包org.apache.commons.dbutils.handlers里的实现类将数据转换成arrays, Maps, 和JavaBeans。每个实现类,都调用了converts的方法,来将ResultSet
中
所有行的数据转换成我们要的数据类型。
QueryRunner run = new QueryRunner(dataSource);
// 用BeanHandler来转换一行结果集的数据,将其送到Person的JavaBean
ResultSetHandler h = new BeanHandler(Person.class);
//在参数里写一条执行的SQL语句,返回的结果强制转换成Person类型,第二个参数上输入刚才设置的h。
Person p = (Person) run.query(
"SELECT * FROM Person WHERE name=?", "John Doe", h);
自定义RowProcessor
每个被提供的ResultSetHandler
实现都接受一个RowProcessor的接口来完成转换的过程。缺省的handlers,用BasicRowProcessor来实现但是你可以实现一个自定义的插件。最常用的方法是实现toBean()
的方法来处理自定义数据库类型。
BasicRowProcessor中的方法是的细节是BeanProcessor转换ResultSet的实现。你可以继承这个类,重载这些方法。
BeanProcessor将一个数据库表中的列映射到bean的属性,如javadoc里面写的BeanProcessor.toBean()。列名必须匹配bean的属性名。例如,firstname列将要调用响应bean的setFirstName()方法,将数据存到javabean的对象里。然而,许多数据库列名的字符既不能被使用,又不是典型的java方法名。你可以做下面2种方法之一:
1, 在sql中加入别名来匹配javabean的属性名。
2, 继承BeanProcessor的子类,并且重写mapColumnsToProperties()方法来转换这些字符串。