zoukankan      html  css  js  c++  java
  • 对apache开源数据库工具dbutils微改第一版

        最近在项目中用到jdbc的持久化工具,采用了开源的组件dbutils。由于在持久化中某种原因需要对dbuitls就行修改以适合项目需要,所以看了一下dbutils的源码。就自己读改源码的过程作一篇博客,以作纪念。

        Dbutils设计非常精巧,代码非常精炼,可惜在源码中未能知道作者是谁。里面的核心主要是两个接口----resultsethandlerrowprocessorResultsethandler主要是对resultset进行处理得到特定的集合,通过对Resultsethandler的不同实现完成了由resultset向各种集合类的转化,我认为Resultsethandler实现时对泛型的运行相当的令人惊叹。而rowprocessor则主要是对resultset中的某一行进行处理,得到对应的元素(分别为Array,map或是bean)。

        主要的类图如下。

     

    在读源码的过程中,发现其中有些费解的地方,看了好多遍一直觉得不慎妥当,于是班门弄斧,自己对源码进行了微改。

        在rowprocessor的接口定义中有toArray,toMap,toBean,toBeanList。前面三个很好理解,对resultset中的一行进行处理得到对应的元素。但是toBeanList是什么意思呢?一行怎么能转换成一个List<Bean>?在beanListHandler中发现其中存在一个beanprocessor,作用相当于basicrowprocessor,却又没有实现rowprocessor接口,它只有两个重要的方法:toBeantoBeanList;beanListHandler是利用它来实现tobeantoBeanList的,这与ArrayListHandlerMapListHandler思路有很大的不同,同时我认为将toBeanList这个方法放到rowprocessor接口中相当的不妥,这与rowprocessor的其他三个方法定义有很大的不同。再细看,推测作者可能是因为beanListHandler的效率问题,不是象ArrayListHandler一样直接循环调用rowprocessortobean方法,才提出这样一个toBeanList将其放入rowprocessor,这只是一种推测,总之toBeanList这个方法出现在rowprocessor令人感觉很突兀和费解。

        于是对源码进行修改如下:

    1,去掉了rowprocessor接口中的toBeanList方法定义。

    2,去掉了beanprocessor类,而是将其功能放到了basicrowprocessor中。

    3,修改beanListHandler类,使其与其他rowprocessor的实现类似。

    修改后的源码如下。

     

    对于源码调整后的类图如下。

     

    及时调整后,我们在项目中要求将一个resultset直接序列化成json格式。那么怎么来实现呢?Rowprocessor没有toJson的方法将某一行转换成json格式。那么只能自己直接写一个实现类resultsethandler了。但是如果只是将某一行转换成json或是csv格式呢,就像ArrayHandler那样,又该怎么办呢?这时Rowprocessor接口不易扩展的局限性就暴露出来了。

     

    如何改进,请收藏并关注后续博文。

     

     

     

  • 相关阅读:
    Matlab中的随机数生成器
    Matlab中的随机数生成器
    Matlab 函数返回矩阵
    Matlab 函数返回矩阵
    Matlab 函数返回矩阵
    矩阵同列同行复制原理
    矩阵同列同行复制原理
    Apache/RewriteRule
    使用google map v3添加经纬度信息
    评论:一站式学习C编程(升级版) (平装)
  • 原文地址:https://www.cnblogs.com/weiwelcome0/p/2508823.html
Copyright © 2011-2022 走看看