BeanListHandler 是可供DBUtils查询器使用的一个Handler类,它的作用是将查询结果转换为一个列表。列表中元素为查询结果所转换的JavaBean,Bean的类型为开发者所指定的Class。参考如下这段代码:
public Template[] list(Connection conn, String owner, String catagory) {
String sql;
QueryRunner runner = new QueryRunner();
BeanListHandler<Template> handler = new BeanListHandler<Template>(Template.class);
sql = "SELECT * FROM GEN_TEMPLATE WHERE OWNER = ? AND CATAGORY = ?";
try {
List<Template> aList = runner.query(conn, sql, handler, new Object[] { owner, catagory });
return aList.toArray(new Template[0]);
} catch (Exception ex) {
throw new GenException(ex, "读���模��表�����常�");
}
}
查询结果每一行都会自动转换为Template类的实例,并且装进List作为结果返回。缺省的查询字段与JavaBean的属性匹配规则是忽略大小写后的字符完全匹配。
通常,数据库的字段往往会出现2个单词以上的情况,比如TEMPLATE_ID这个字段名,以下划线作为分隔。对应的JavaBean的属性名,按照Java的命名规范(驼峰原则),则是templateId。这种情况下,BeanListHandler就无法做TEMPLATE_ID->templateId的映射了。对于这样的问题,有一种解决办法就是给查询结果的显示字段取别名,如TEMPLATE_ID AS templateId。在字段较少的情况下,这个办法可以作为权益之计。但是,字段较多的时候,这种办法就显得很笨拙了。
另外一种想法,就是BeanListHandler能够做TEMPLATE_ID->templateId的映射。
那么如何使BeanListHandler按照我们的要求做映射呢?打开DBUtils的源代码,来看下它的内在处理机制。
BeanListHandler通过handle方法处理查询结果ResultSet的实例,并返回最终的List实例。handle方法使用RowProcessor作为ResultSet->BeanList的转换器,调用它的toBeanList方法完成转换。缺省情况下,BeanListHandler所使用的RowProcessor为ArrayHandler的缺省RowProcessor,其类型是BasicRowProcessor。缺省情况下,BasicRowProcessor使用BeanProcessor作为转换器,调用它的toBeanList方法。
总结一下调用次序:
BeanListHandler.handle->BasicRowProcessor.toBeanList->BeanProcessor.toBeanList
原来BeanProcessor.toBeanList是完成这个转换的关键,映射规则的处理机制就藏在这里。
BeanProcessor.toBeanList的实现机理,大致是以下几个步骤
1. 循环处理ResultSet每一行记录
1.1 得到JavaBean的属性集合
1.2 得到ResultSet的元数据集合
1.3 调用mapColumnsToProperties方法,得到以上2者的映射关系索引集
1.4 创建JavaBean的实例,并根据1.3得到的索引集,完成行的值到JavaBean属性的注入
至此我们了解了整个转换过程,解决方案也相应而生。以BeanProcessor作为父类,实现一个自定义的BeanProcessor子类,并使用自定义的mapColumnsToProperties方法覆盖父类的方法。代码如下:
import java.beans.PropertyDescriptor;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Arrays;
import org.apache.commons.dbutils.BeanProcessor;
/**
* æ�©å±�BeanProcessorç��å¤�ç��æ�¹å¼�ï¼�使å�¶è�½å¤�å¤�ç��å¦�DATA_OBJECT_NAME -> dataObjectNameè¿�æ ·ç��æ� å°�å�³ç³»
*/
public class GenBeanProcess extends BeanProcessor {
/**
* æ�¿æ�¢BeanProcessorç��æ� å°�å�³ç³»å¤�ç��
*/
@Override
protected int[] mapColumnsToProperties(ResultSetMetaData rsmd, PropertyDescriptor[] props) throws SQLException {
int cols = rsmd.getColumnCount();
int[] columnToProperty = new int[cols + 1];
Arrays.fill(columnToProperty, PROPERTY_NOT_FOUND);
for (int col = 1; col <= cols; col++) {
String columnName = rsmd.getColumnLabel(col);
if (null == columnName || 0 == columnName.length()) {
columnName = rsmd.getColumnName(col);
}
for (int i = 0; i < props.length; i++) {
if (convert(columnName).equals(props[i].getName())) {
columnToProperty[col] = i;
break;
}
}
}
return columnToProperty;
}
/**
* DATA_OBJECT_NAME -> dataObjectName
*/
private String convert(String objName) {
StringBuilder result = new StringBuilder();
String[] tokens = objName.split("_");
for (String token : tokens) {
if (result.length() == 0)
result.append(token.toLowerCase());
else
result.append(StringUtils.capitalize(token.toLowerCase()));
}
return result.toString();
}
}
// å��å°�å¼�å¤´æ ·ä¾�ä¸ç��è¿�å�¥
BeanListHandler<Template> handler = new BeanListHandler<Template>(Template.class);
// ��为
BeanListHandler<Sql> handler = new BeanListHandler<Sql>(Template.class, new BasicRowProcessor(new GenBeanProcess()));
分享到:
相关推荐
apache commons dbutils api_zh
Apache commons dbutils 1.4jar是JDBC的开源数据库工具包
Apache Commons DbUtils 1.6 API,网页形式的api文档
由于Apache 官网下载加载时间较长,所以上传到CSDN供大家下载
apache dbutils中文说明
commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。 springmvc与springmvc 整合demo
apache 的 DbUtils1.6版的Html格式API 很全1.6最新版的Apache de DbUtils API网上不好找到的,找了很久,传上来方便大家下载
apache commons dbutils实现增删改查功能
Apache Common CLI 参数解析的源码包,对应的是Java语言,使用Apache License
dbutils的jar包和源码
这个是Apache DbUtils 1.5 API,是我根据官方的制作的
apache 的 DBUtils是一个为简化JDBC操作的小类库,使用方便,上手很快,是个不错的东西
数据库查询工具包 Commons-DbUtils 1.5 api 文档,官方下载,原创制作
DBUtils是个小巧的JDBC轻量级封装的工具包,其最核心的特性是结果集的封装,可以直接将查询出来的结果集封装成JavaBean,这就为我们做了最枯燥乏味、最容易出错的一大部分工作。
commons-dbutils包是Apache开源组织提供的用于操作数据库的工具包。简单来讲,这个工具包就是用来更加方便我们操作数据库的,最近工作中使用了一下,感觉确实方便很多,基本告别自己封装JDBC代码对数据库进行增删改...
org apache commons dbutils org apache commons dbutils handlers org apache commons dbutils wrappers DBUtils封装了对JDBC的操作 简化了JDBC操作 可以少写代码 org apache commons dbutils DbUtils 关闭链接等...
Apache Commons DbUtils 包是一组用于简化 JDBC 开发的 Java 实用程序类。原则上这不能说是一个持久层框架,它提供了一些Jdbc的操作封装来简化数据查询和记录读取操作
apache-commons下全部官方源码和官方API文档,其中有: commons-beanutils-1.8.0 commons-codec commons-collections commons-dbcp commons-dbutils commons-fileupload commons-io commons-lang commons-lang3 ...
采用Apache dbutils操作数据库的DAO类:
dbutils dbutils dbutils dbutils