DBUtils架构分析
首先,我们看看DBUtils的组织架构图
一点一点来看,AbstructQueryRunner封装了PreparStatement的产生与装填,同时还包括了对数据库资源的关闭等操作。它有两个子类,QueryRunner与AsyncQueryRunner。
先说AsyncQueryRunner,看看名字我们就知道,它的异步的获取数据库信息。
我们看一小段代码:
//AsyncQueryRunner.java
public <T> Future<T> query(final String sql, final ResultSetHandler<T> rsh) throws SQLException {
return executorService.submit(new Callable<T>() {
@Override
public T call() throws Exception {
return queryRunner.query(sql, rsh);
}
});
}
看到executorService.submit与Future<T>了吧#关于异步调用的知识大家可以参见拙作
Callable与Future
这里我们主要看QueryRunner,它里面的结构很清晰
主要就是增,改(删),查的sql包装,构造函数等等。
通过类图,我们可以看到,QueryRunner依赖于ResultSetHandler。
看看类图我们就知道,这是一个策略模式。
ResultSetHandler就是抽象的接口。
那么ResultSetHandler是干什么的呢?
看名字,ResultSetHander,它就是处理ResultSet的。
根据需求,ResultSet得能转化成各种类型,至少得包括Bean,List<Bean>,Map,List<Map>,当然还有数组。
那具体如何转化呢?
//BeanHandler.java
@Override
public T handle(ResultSet rs) throws SQLException {
return rs.next() ? this.convert.toBean(rs, this.type) : null;
}
这个convert就是转换的核心,在BeanHandler初始化的时候就已经有了。
代码读到这个位置,我已经产生了一些疑问。
1 在RowProcessor中既然已经有了toMap,为什么不能有toMapList与toArrayList?
2 在basicRowProcessor中toArray与toMap是自己直接完成的,而toBean与toBeanList却代理了 BeanProcessor。这又是为什么?
其实第二个问题,我想想答案估计还是:细分二字。
不过第一个问题,我确实没想明白。
关于toMapList,通过了模板模式,在AbstractListHandler<T>里调用了handleRow
@Override
public List<T> handle(ResultSet rs) throws SQLException {
List<T> rows = new ArrayList<T>();
while (rs.next()) {
rows.add(this.handleRow(rs));
}
return rows;
}
protected abstract T handleRow(ResultSet rs) throws SQLException;
而handleRow在MapListHandler里实现,依赖于basicRowProcessor中的toMap。
AbstractListHandler存在的价值就在于把MapListHandler与ArrayListHandler关于list的循环提了上去。
我猜想,没有toMapList与toArrayList是嫌麻烦,有toBean与toBeanList是因为有BeanProcessor。
DBUtils架构分析的更多相关文章
- tomcat架构分析 (Session管理)
Session管理是JavaEE容器比较重要的一部分,在app中也经常会用到.在开发app时,我们只是获取一个session,然后向session中存取数据,然后再销毁session.那么如何产生se ...
- Magento架构分析,Magento MVC 设计分析
Magento架构分析,Magento MVC 设计分析 分类:Magento 标签:Magento MVC.Magento架构 669人浏览 Magento 采用类似 JAVA的架构,其扩展与稳定性 ...
- Flickr 网站架构分析
Flickr 网站架构分析 Flickr.com 是网上最受欢迎的照片共享网站之一,还记得那位给Windows Vista拍摄壁纸的Hamad Darwish吗?他就是将照片上传到Flickr,后而被 ...
- Android架构分析之Android消息处理机制(二)
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本号:4.4.2 在上一篇文章中我们看了一个使用Handler处理Message消息的样例,本文我们 ...
- NopCommerce架构分析(转载)
原文 一,NopCommerce架构分析之开篇 NopCommerce是.net开源项目中比较成熟的一款业务应用框架,也是电子商务系统中的典范.所以很想多学习一下里面的设计和实现方式. 二,NopCo ...
- Qualcomm Android display架构分析
Android display架构分析(一) http://blog.csdn.net/BonderWu/archive/2010/08/12/5805961.aspx http://hi.baidu ...
- tomcat架构分析-索引
出处:http://gearever.iteye.com tomcat架构分析 (概览) tomcat架构分析 (容器类) tomcat架构分析 (valve机制) tomcat架构分析 (valve ...
- [转载] 关于“淘宝应对"双11"的技术架构分析”
微博上一篇最新的关于“淘宝应对"双11"的技术架构分析”.数据产品的一个最大特点是数据的非实时写入.
- apache kafka系列之性能优化架构分析
apache kafka中国社区QQ群:162272557 Apache kafka性能优化架构分析 应用程序优化:数据压缩 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...
随机推荐
- linux下内存的统计和内存泄露类问题的定位
在产品的开发中,通过对当前系统消耗内存总量的统计,可以对产品所需内存总量进行精确的评估,从而选择合适的内存芯片与大小,降低产品的成本.在遇到内存泄露类问题时,经常会对此束手无策,本文通过对proc下进 ...
- Python 3.3.3 使用requests模拟登录网站
在模拟登录上,requests确实比python标准库中的相关模块更加简洁. 假设你需要去爬一组页面(targetUrls),而这些页面要登录才能进行访问.那么requests能够提供一种相当简单的语 ...
- Maven坐标机制
Maven为所有的项目引入了坐标,基于坐标机制可以唯一定位一个项目. 坐标详解 以spring-core-2.5.6.jar的坐标定义为例,说明组成坐标的所有元素:groupId.artifactId ...
- Android开发学习之路--Drawable mutations
时间过得很快,明天终于可以拿到房子了,交完这次房租,也可以成为房东了,看看博客也好久没有更新了,最近一直在整机器人,也没有太多时间整理博客. 今天下午和同事一起遇到了一个问题,就是明明没有改变 ...
- EBS销售订单挑库发放处理程序
来自:http://blog.csdn.net/cunxiyuan108/article/details/6014769 在EBS实施中,经常遇到从外部传进来一个被登记的销售订单,需要通过程序进行销售 ...
- RxJava操作符(04-过滤操作)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51656494 本文出自:[openXu的博客] 目录: Debounce Distinct ...
- 1CCTableView的使用,TableView响应和小格子tableView实现
1 CCTableView的使用 T26TableView.h #ifndef __T26TableView_H__ #define __T26TableView_H__ #includ ...
- XMPP系列(七)---获取群组列表
上一篇介绍了如何创建群组,这一篇就介绍一下,如何获取自己的群组列表. 在上一篇有提到,如果我们创建的群组是公共的群组,那么获取自己的群组列表时,会获取到自己的群组列表和那些公共的群组.而实际做社交的应 ...
- ORACLE数据库学习之逻辑结构
逻辑结构 数据库逻辑结构包含表空间.段.范围(extent).数据块和模式对象. (一)表空间 一个数据库划分为一个或多个逻辑单位,该逻辑单位称为表空间类似于sybase下的设备.(TABLES ...
- 闪屏页面开发遇到的问题you need to use a theme.appcompat theme (or descendant)
开始做一个新闻客户端的应用,在做到闪屏页面时之前发布应用的时候总是报错,原因是我在splash.java中把Activty写成ActionBarActivity,导包,然后就可以了.以前也遇到过这种情 ...