|
这几天在研究 dbutils 的源码,感觉收获很大,至于说到收获了什么,我也很难描述的清楚,便想借助下面的图和文字来描述自己的所学和所得。
在开始本文之前,我给自己带来了一些疑问,就是通过原始的sql 实现无浸入式的分页工具,一直很想仿 dbutil 的思想,可是还是实现不了。希望有高手可以一些指点。
dbutil 是对 jdbc 进行了一些简单的封装,有人说 dbutil 的强大之处在于其强大的结果集处理,这个不可否认。不过通过这几天在临摹 dbutil 的实现时,我觉得更为强大的是其背后的设计逻辑(而本人也是通过这种逻辑来实现一个分页工具,不过暂未实现)。先看一个基础图(建议下载下来看):
1、首先,我们从一个简单查询开始谈起,在 QueryRunner 里有这么一个查询方法,如下:
public T query(String sql, ResultSetHandler rsh, Object... params);
简单的介绍一下:这个方法其实很容易理解,sql 即 select 的查询语句,params 为 sql 的参数,而 rsh 就是一个结果集处理器,通过这个结果集处理器,可以返回我们所需要的类型,如Map,Object[],List 和 javabean 等。所以我认同 dbutil 的一点就是:
dbutil 可灵活定制的返回的类型。
2、ResultSetHandler 是一个接口,它只有一个方法 void handle(ResultSet rs)。如我们想返回一个 Map 对象,可以这样做:
ResultSetHandler handler = new ResultSetHandler (){
public Object[] handle(ResultSet rs) throws SQLException {
if (!rs.next()) {
return null;
}
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
Map row = new HashMap();
for (int i = 1; i |
|
|