对apache开源数据库工具dbutils微改第一版
最近在项目中用到jdbc的持久化工具,采用了开源的组件dbutils。由于在持久化中某种原因需要对dbuitls就行修改以适合项目需要,所以看了一下dbutils的源码。就自己读改源码的过程作一篇博客,以作纪念。
Dbutils设计非常精巧,代码非常精炼,可惜在源码中未能知道作者是谁。里面的核心主要是两个接口----resultsethandler和rowprocessor。Resultsethandler主要是对resultset进行处理得到特定的集合,通过对Resultsethandler的不同实现完成了由resultset向各种集合类的转化,我认为Resultsethandler实现时对泛型的运行相当的令人惊叹。而rowprocessor则主要是对resultset中的某一行进行处理,得到对应的元素(分别为Array,map或是bean)。
主要的类图如下。
在读源码的过程中,发现其中有些费解的地方,看了好多遍一直觉得不慎妥当,于是班门弄斧,自己对源码进行了微改。
在rowprocessor的接口定义中有toArray,toMap,toBean,toBeanList。前面三个很好理解,对resultset中的一行进行处理得到对应的元素。但是toBeanList是什么意思呢?一行怎么能转换成一个List<Bean>?在beanListHandler中发现其中存在一个beanprocessor,作用相当于basicrowprocessor,却又没有实现rowprocessor接口,它只有两个重要的方法:toBean和toBeanList;beanListHandler是利用它来实现tobean和toBeanList的,这与ArrayListHandler,MapListHandler思路有很大的不同,同时我认为将toBeanList这个方法放到rowprocessor接口中相当的不妥,这与rowprocessor的其他三个方法定义有很大的不同。再细看,推测作者可能是因为beanListHandler的效率问题,不是象ArrayListHandler一样直接循环调用rowprocessor的tobean方法,才提出这样一个toBeanList将其放入rowprocessor,这只是一种推测,总之toBeanList这个方法出现在rowprocessor令人感觉很突兀和费解。
于是对源码进行修改如下:
1,去掉了rowprocessor接口中的toBeanList方法定义。
2,去掉了beanprocessor类,而是将其功能放到了basicrowprocessor中。
3,修改beanListHandler类,使其与其他rowprocessor的实现类似。
修改后的源码如下。
对于源码调整后的类图如下。
及时调整后,我们在项目中要求将一个resultset直接序列化成json格式。那么怎么来实现呢?Rowprocessor没有toJson的方法将某一行转换成json格式。那么只能自己直接写一个实现类resultsethandler了。但是如果只是将某一行转换成json或是csv格式呢,就像ArrayHandler那样,又该怎么办呢?这时Rowprocessor接口不易扩展的局限性就暴露出来了。
如何改进,请收藏并关注后续博文。