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.6 API 是一个Java库,它为数据库操作提供了简化的、异常安全的工具。这个API设计的目的是为了简化JDBC(Java Database Connectivity)编程,减轻开发人员处理数据库连接、事务和结果集时的...
使用了Apache Commons DbUtils库中的类和方法封装JDBC,使用了org.apache.commons.dbutils.QueryRunner、org.apache.commons.dbutils.handlers.BeanHandler和org.apache.commons.dbutils.handlers.BeanListHandler等...
Apache DBUtils是一个开源的Java库,它为Java应用程序提供了简单且有效的数据库连接管理。这个工具包简化了JDBC(Java Database Connectivity)的使用,通过提供一个健壮且易于使用的抽象层,使得数据库操作变得更加...
1. **QueryRunner**: 这是DBUtils的主要类,用于执行SQL查询和更新操作。它提供了静态方法来执行单行或多行查询,以及插入、更新和删除操作。QueryRunner处理了诸如打开和关闭连接、事务管理和异常处理等繁琐的细节...
EnhancedJDBC是一个基于Apache Commons DbUtils构建并扩展其功能的纯JDBC持久层工具,项目包含410个文件,主要由401个Java源文件组成,辅以少量批处理脚本、Markdown文档、版本控制忽略文件、许可协议文件、XML配置...
**dbutils** 是一个 Apache Commons 项目,它提供了一个简单且高效的 Java 数据库连接工具集。这个工具包是为了简化数据库操作而设计的,它构建在 JDBC(Java Database Connectivity)之上,为开发人员提供了更方便...
源码包"commons-cli-1.2-src"包含了Apache Common CLI 1.2的所有源代码,开发者可以通过查看源码深入理解其内部实现机制,这对于学习和定制该库的功能非常有帮助。Apache Common CLI 使用了Apache License,这是一种...
commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。 springmvc与springmvc 整合demo
总结来说,Apache Commons DbUtils是一个强大的数据库操作助手,它的源码阅读有助于我们更好地理解和掌握数据库操作的最佳实践。通过实例应用和测试,我们可以深入理解DbUtils的工作原理,并将其有效地应用到实际...
1. `DbUtils`类: - `DbUtils`包含了一些静态方法,用于执行数据库操作中的常见任务,如关闭连接、声明和结果集(ResultSet)。例如,`close()`方法用于安全地关闭数据库资源,即使资源为空也不会抛出异常。`...
Apache DBUtils 是一个轻量级的 Java 数据库连接(JDBC)工具,它提供了一些实用功能,简化了数据库操作。DBUtils 最主要的功能是对 JDBC 结果集进行封装,能够将查询结果直接转换为 JavaBean 对象,从而减轻开发...
Apache Commons DBUtils 是一个基于 Apache Commons JDBC 的轻量级数据库操作库,它简化了 Java 应用程序中的数据库访问,特别是在执行 SQL 查询和处理结果集时。DBUtils 提供了一种安全、简单的方式来处理数据库...
1. 数据库连接管理:DBUtils提供了ConnectionHelper类,用于管理数据库连接的生命周期。它遵循了数据库连接的获取、使用和释放的最佳实践,避免了资源泄露和空闲连接过多的问题。开发者只需要配置好数据库连接参数,...
这个是Apache DbUtils 1.5 API,是我根据官方的制作的
1. **Apache Commons DBUtils** Apache Commons DBUtils是Apache软件基金会的一个开源项目,提供了一个简单易用的接口来处理JDBC相关的任务。它不是数据库抽象层,而是作为JDBC API的辅助工具,帮助开发者避免了...
Apache DbUtils是Apache软件基金会开发的一个轻量级Java数据库操作工具库,主要目的是简化数据库的交互,使得开发者能够更高效地处理SQL操作。DbUtils 1.6版本是该库的一个较新版本,包含了丰富的API和功能,尤其...
Apache Commons DbUtils 是一个开源的 Java 库,它是 Apache Commons 项目的一部分,旨在为 Java 开发者提供一种简单且安全的方式来处理 JDBC(Java Database Connectivity)操作。DbUtils 的设计目标是减少那些繁琐...
数据库查询工具包 Commons-DbUtils 1.5 api 文档,官方下载,原创制作
Apache Commons DBUtils是Java开发中的一个实用工具库,主要用于简化JDBC(Java Database Connectivity)的使用。这个资源包"commons-dbutils-1.6-bin.zip"包含了DBUtils 1.6版本的源代码和相关文档,是理解并使用...