文档章节

DbUtils开源组件--源码研究和应用实践小结

FansUnion
 FansUnion
发布于 2015/10/22 10:29
字数 1219
阅读 4
收藏 0

 

Apache Common DbUtils是操作数据库的组件,对传统操作数据库的类(JDBC)进行二次封装,可以把结果集转化成List。DbUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。

官方网站:http://commons.apache.org/dbutils/

下载地址:http://commons.apache.org/dbutils/download_dbutils.cgi

官方例子:http://commons.apache.org/dbutils/examples.html(可能有个别错误)

个人例子http://download.csdn.net/detail/fansunion/4840246

 

 

源码研究小结

一、概述
版本:1.4


包:3个,org.apache.commons.dbutils,

         org.apache.commons.handlers,

         org.apache.commons.dbutils.wrappers
接口:2个
类:22个(不包含package-info.java)
package-info.java:3个


 

二、org.apache.commons.dbutils包和类的解读

    包含一些些核心类和接口,DbUtils, QueryRunner和ResultSetHandler接口最值得关注。

 

①DbUtils工具类

主要功能:

1.关闭资源(Connection,Statement,ResultSet)

2.提交与回滚(commit,rooback)

3.加载驱动(loadDriver)

4.打印堆栈和警告(printStackTrace,printWarnings)

 

②处理器
RowProcessor接口:将ResultSet的行转换为各种类型的对象。

BasicRowProcessor:RowProcessor接口的基本实现。

BeanProcessor:将列名和Bean的属性名进行匹配,将ResultSet的列转换成Bean属性。
子类可以覆盖这些方法,在处理链中,实现自定义行为。


 

③ProxyFactory(代理工厂):
 
 创建JDBC 7个接口的代理实现,避免了JDBC2和JDBC3接口的不兼容。

 7个接口:Driver,Connection,Statement,PreparedStatement,CallableStatement,ResultSet,ResultSetMetaData
 
 核心方法:newProxyInstance
  public <T> T newProxyInstance(Class<T> type, InvocationHandler handler) {


  return type.cast(Proxy.newProxyInstance(handler.getClass()
    .getClassLoader(), new Class<?>[] { type }, handler));


 }
 


 ④查询执行器
AbstractQueryRunner:QueryRunner 和AsyncQueryRunner的父类。

QueryRunner:查询处理器,执行query,update,batch操作。

AsyncQueryRunner:异步的查询处理器,执行query,update,batch操作。

 

 

⑤查询加载器
QueryLoader:查询集合的注册中心,多个相同的查询副本不必要全都加载到内存中。
这个实现加载属性文件,文件内容是 查询名到SQL的映射 。
主要方法:load,unload

 

⑥结果集迭代器

ResultSetIterator:把ResultSet包装进Iterator中。当你想存在一个非数据库应用层 带有模型中立的数据时,
这是非常有用的。这个实现类需要 ResultSet的isLast()方法已经被实现。


 

⑦ResultSetHandler接口

  这个接口的实现类将ResultSet转换成其它的对象。


三、org.apache.commons.dbutils.handlers包和类的解读

 

ResultSetHandler接口的实现类(2个抽象类,9个具体类)

①KeydHandler
AbstractKeydHandler(KeyHandler):返回Map.
将ResultSet的行转换成对象,存储在Map中,在指定的Key下。

KeyHandler:返回Map<Map>.
将ResultSet的行转换成Map,存储在Map中,在指定的Key下。


 

②ListHandler
AbstractListHander(ArrayListHandler,ColumnListHandler,MapListHandler):
抽象类,简化ResultSetHandler类的开发,将ResultSet转换成List。

ArrayListHandler:将结果集转换成List<Object>.
ColumnListHandler:将结果集的某一列转换成List<Object>.
MapListHandler:将结果集转换成List<Map>.

 

③其它Handler


ArrayHandler:将结果集转换成Object[]。

BeanHandler<T>:将结果集的第一行转换成一个JavaBean.

BeanListHandler<T>:将结果集转换成List<Bean>.

MapHandler:将结果集的第一行转换成一个Map。

ScalarHandler:将结果集的某一列转换成Objects。
列通过columnIndex或columnName指定。

 

四、package org.apache.commons.dbutils.wrappers包和类的解读


 包装类,给java.sql中的类增加功能。ResultSet的2个包装类。

①SqlNullCheckedResultSet:
包装ResultSet,使得调用每一个getXXX方法时,检查SQL NULL值。
如果通过getXXX方法获得的列值不是SQL NULL,返回列值,否则,代替值被返回。
该代替值默认为Java的null值,可以被类的实例覆盖。

 

使用示例:

 Connection conn = // somehow get a connection
 Statement stmt = conn.createStatement();
 ResultSet rs = stmt.executeQuery("SELECT col1, col2 FROM table1");

 // Wrap the result set for SQL NULL checking
 SqlNullCheckedResultSet wrapper = new SqlNullCheckedResultSet(rs);
 wrapper.setNullString("---N/A---"); // Set null string
 wrapper.setNullInt(-999); // Set null integer
 rs = ProxyFactory.instance().createResultSet(wrapper);

 while (rs.next()) {
     // If col1 is SQL NULL, value returned will be "---N/A---"
     String col1 = rs.getString("col1");
     // If col2 is SQL NULL, value returned will be -999
     int col2 = rs.getInt("col2");
 }
 rs.close();

 

②StringTrimedResultSet:
包装ResultSet,使得通过getString() and getObject()获得的String,经过String.trim()方法处理。

 

使用示例:

ResultSet rs = // somehow get a ResultSet;

 // Substitute wrapped ResultSet with additional behavior for real ResultSet
 rs = StringTrimmedResultSet.wrap(rs);

 // Pass wrapped ResultSet to processor
 List list = new BasicRowProcessor().toBeanList(rs);

 

 


应用实践小结

 

源码地址http://download.csdn.net/detail/fansunion/4840246

 

一、cn.fansunion.dbutils.example,5个独立的例子。

1.AsyncUpdateExample.java,演示如何执行异步更新。

2.BeanHandlerExample.java,演示如何使用BeanHandler,将结果集的一行转换成一个JavaBean。

3.BeanListHandlerExample.java,演示BeanListHandler如何使用,BeanListHandler实现类将结果集转换成指定对象类型的集合。

4.InsertUpdateExample.java,演示如何执行添加和更新。

5.ResultSetHandlerExample.java,演示结果集处理器如何使用。

 

二、cn.fansunion.dbutils.example.connection,数据库连接。

1.ConnectionProvider.java,数据库连接的提供类。

2.PropertyReader.java,读取配置属性。

3.jdbc.properties 属性配置。

 

三、cn.fansunion.dbutils.example.common,公共资源。

1.DbUtilsExampleBase.java,DbUtils例子的父类,包含了一些常用的方法,获得连接、关闭连接、打印对象。

2.MyDataSource.java,自定义的数据源实现类。

3.Person.java,数据库表对应的实体类。

4.person.sql,数据库表建表脚本。


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
FansUnion
粉丝 57
博文 858
码字总数 825464
作品 0
丰台
高级程序员
私信 提问

暂无文章

day178-2018-12-15-英语流利阅读-待学习

“真蛛奶茶”了解一下?蜘蛛也会产奶了 Lala 2018-12-15 1.今日导读 “蛋白质含量是牛奶的 4 倍,并有着更低的脂肪和含糖量”,听起来诱人又美味的并不是羊奶或豆奶,而是你可能打死都想不到...

飞鱼说编程
14分钟前
3
0
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents

场景重现 npm install --verbose 安装依赖的时,出现如下警告 强迫症患者表示不能接受 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules\fsevents):npm WARN......

taadis
19分钟前
1
0
MySQL自增id超大问题查询

引言 小A正在balabala写代码呢,DBA小B突然发来了一条消息,“快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了,插入...

dragon_tech
31分钟前
3
0
OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文 :分享Roy Orbison的单曲《She's a Mystery to Me》 《She's a Mystery to Me》- Roy Orbison 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
279
6
Spring源码学习笔记-1-Resource

打算补下基础,学习下Spring源码,参考书籍是《Spring源码深度解析》,使用版本是Spring 3.2.x,本来想试图用脑图记录的,发现代码部分不好贴,还是作罢,这里只大略记录下想法,不写太细了 ...

zypy333
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部