`
nswish
  • 浏览: 108109 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Apache Common DBUtils源码研究(1)

    博客分类:
  • Java
阅读更多

 

  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 &lt;= cols; col++) {
                        String columnName = rsmd.getColumnLabel(col);
                        if (null == columnName || 0 == columnName.length()) {
                                columnName = rsmd.getColumnName(col);
                        }
                        for (int i = 0; i &lt; 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 api_zh

    Apache Commons DbUtils 1.6 API

    Apache Commons DbUtils 1.6 API 是一个Java库,它为数据库操作提供了简化的、异常安全的工具。这个API设计的目的是为了简化JDBC(Java Database Connectivity)编程,减轻开发人员处理数据库连接、事务和结果集时的...

    Apache-DBUtils封装JDBC

    使用了Apache Commons DbUtils库中的类和方法封装JDBC,使用了org.apache.commons.dbutils.QueryRunner、org.apache.commons.dbutils.handlers.BeanHandler和org.apache.commons.dbutils.handlers.BeanListHandler等...

    04-Apache-DBUtils驱动.rar

    Apache DBUtils是一个开源的Java库,它为Java应用程序提供了简单且有效的数据库连接管理。这个工具包简化了JDBC(Java Database Connectivity)的使用,通过提供一个健壮且易于使用的抽象层,使得数据库操作变得更加...

    Apache commons dbutils 1.4jar是JDBC的开源数据库工具包

    1. **QueryRunner**: 这是DBUtils的主要类,用于执行SQL查询和更新操作。它提供了静态方法来执行单行或多行查询,以及插入、更新和删除操作。QueryRunner处理了诸如打开和关闭连接、事务管理和异常处理等繁琐的细节...

    基于Apache Commons DbUtils的EnhancedJDBC设计源码

    EnhancedJDBC是一个基于Apache Commons DbUtils构建并扩展其功能的纯JDBC持久层工具,项目包含410个文件,主要由401个Java源文件组成,辅以少量批处理脚本、Markdown文档、版本控制忽略文件、许可协议文件、XML配置...

    dbutils的jar包和源码

    **dbutils** 是一个 Apache Commons 项目,它提供了一个简单且高效的 Java 数据库连接工具集。这个工具包是为了简化数据库操作而设计的,它构建在 JDBC(Java Database Connectivity)之上,为开发人员提供了更方便...

    Apache Common CLI 1.2 源码

    源码包"commons-cli-1.2-src"包含了Apache Common CLI 1.2的所有源代码,开发者可以通过查看源码深入理解其内部实现机制,这对于学习和定制该库的功能非常有帮助。Apache Common CLI 使用了Apache License,这是一种...

    Apache Dbutils +springmvc 框架demo代码

    commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。 springmvc与springmvc 整合demo

    Commons DbUtils源码阅读之实例及测试应用

    总结来说,Apache Commons DbUtils是一个强大的数据库操作助手,它的源码阅读有助于我们更好地理解和掌握数据库操作的最佳实践。通过实例应用和测试,我们可以深入理解DbUtils的工作原理,并将其有效地应用到实际...

    apache dbutils中文说明

    1. `DbUtils`类: - `DbUtils`包含了一些静态方法,用于执行数据库操作中的常见任务,如关闭连接、声明和结果集(ResultSet)。例如,`close()`方法用于安全地关闭数据库资源,即使资源为空也不会抛出异常。`...

    Apache DBUtils使用总结

    Apache DBUtils 是一个轻量级的 Java 数据库连接(JDBC)工具,它提供了一些实用功能,简化了数据库操作。DBUtils 最主要的功能是对 JDBC 结果集进行封装,能够将查询结果直接转换为 JavaBean 对象,从而减轻开发...

    apache commons dbutils实现增删改查功能

    Apache Commons DBUtils 是一个基于 Apache Commons JDBC 的轻量级数据库操作库,它简化了 Java 应用程序中的数据库访问,特别是在执行 SQL 查询和处理结果集时。DBUtils 提供了一种安全、简单的方式来处理数据库...

    commons-dbutils-1.4.jar

    1. 数据库连接管理:DBUtils提供了ConnectionHelper类,用于管理数据库连接的生命周期。它遵循了数据库连接的获取、使用和释放的最佳实践,避免了资源泄露和空闲连接过多的问题。开发者只需要配置好数据库连接参数,...

    Apache DbUtils 1.5 API下载

    这个是Apache DbUtils 1.5 API,是我根据官方的制作的

    commons-dbutils.jar.rar

    1. **Apache Commons DBUtils** Apache Commons DBUtils是Apache软件基金会的一个开源项目,提供了一个简单易用的接口来处理JDBC相关的任务。它不是数据库抽象层,而是作为JDBC API的辅助工具,帮助开发者避免了...

    apache 的 DbUtils1.6版的Html格式API 很全

    Apache DbUtils是Apache软件基金会开发的一个轻量级Java数据库操作工具库,主要目的是简化数据库的交互,使得开发者能够更高效地处理SQL操作。DbUtils 1.6版本是该库的一个较新版本,包含了丰富的API和功能,尤其...

    Apache Commons DbUtils 包是一组用于简化 JDBC 开发的 Java 实用程序类

    Apache Commons DbUtils 是一个开源的 Java 库,它是 Apache Commons 项目的一部分,旨在为 Java 开发者提供一种简单且安全的方式来处理 JDBC(Java Database Connectivity)操作。DbUtils 的设计目标是减少那些繁琐...

    Apache Commons DbUtils 1.5 API CHM

    数据库查询工具包 Commons-DbUtils 1.5 api 文档,官方下载,原创制作

    dbutils1.6

    Apache Commons DBUtils是Java开发中的一个实用工具库,主要用于简化JDBC(Java Database Connectivity)的使用。这个资源包"commons-dbutils-1.6-bin.zip"包含了DBUtils 1.6版本的源代码和相关文档,是理解并使用...

Global site tag (gtag.js) - Google Analytics