iBATIS DAO框架浅析

开发 后端
iBATIS DAO框架是什么概念?iBATIS DAO的常用字段又是哪些呢?本文将会给你一一介绍。

iBATIS DAO框架的书写方便,本文采用如下简写约定:

◆Transaction:Tx

◆Manager:Mgr

◆Context:Ctx

◆Interface:Iface

iBATIS DAO框架如图:

iBATIS DAO框架图 

iBATIS DAO的核心在于DaoManager,DaoManager的创建代码如下:

  1. Reader reader = Resources.getResourceAsReader("dao.xml");  
  2. DaoManager daoMngr = DaoManagerBuilder.buildDaoManager(reader); 

DaoManager是接口,查看DaoManagerBuilder源代码可发现,其buildDaoManager方法返回的是一个StandardDaoManager实例。buildDaoManager方法调用了XmlDaoManagerBuilder类的buildDaoManager方法,该方法完成如下工作:

1.创建一个StandardDaoManager实例stdDaoMgr;

2.创建一个用于全局收集各种property(来自<properties>元素指向的资源文件或来自当前dao.xml中的各级<property>元素)的Properties对象;

3.解析dao.xml文件(建议阅读本文时参考一份dao.xml文件,如JGameStore应用中给出的dao.xml)中的<properties>元素,将相应property加入;

4.解析dao.xml文件中的<context>元素,得到一个DaoContext实例daoCtx(4.1);并将调用stdDaoMgr.addContext方法将daoCtx添加到stdDaoMgr中(4.2):

4.1 解析dao.xml文件的<context>元素得到daoCtx的过程为:

实例化一个DaoContext对象daoCtx;

将其daoManager字段设为我们的stdDaoMgr;

如<context>有id属性,则将daoCtx的id字段取为此属性的值;

解析<context>的子元素:

4.1.1解析<txMgr>子元素,得到DaoTxMgr接口实例txMgr,设为daoCtx的相应字段,解析过程为:

根据<txMgr>子元素的type属性,实例化一个相应的DaoTxMgr实例txMgr;

解析<txMgr>的<property>子元素,将所得property添加入properties;

根据properties对txMgr进行配置(即调用txMgr.configure方法);

4.1.2解析<dao>子元素,得到一个DaoImpl类实例daoImpl,然后将其加入daoCtx;

4.1.2.1解析过程为:

4.1.2.1.1实例化一个DaoImpl类实例daoImpl;

4.1.2.1.2将daoImpl的daoMgr字段设为我们的stdDaoMgr;

4.1.2.1.3将daoImpl的daoCtx字段设为我们的daoCtx;

4.1.2.1.4将daoImpl的daoIface字段设为<dao>的iface属性值对应的class;

4.1.2.1.5将daoImpl的daoImplementation字段设为<dao>的implementation属性值对应的class;

4.1.2.1.6根据implementation属性实例化一个DAO实现类,设为daoInstance字段值,注意,该实例一定是一个Dao接口实例,因为任何一个都继承自DaoTemplate,而DaoTemplate实现了Dao接口;

4.1.2.1.7创建一个当前DAO实现类的代理,设为daoImpl的proxy字段值,该代理在启用显式事务时会在调用委托方法前调用daoCtx.startTx方法;在使用隐式事务时则在调用委托方法的前后分别调用daoCtx.startTx方法和commitTx方法(在finally块中还调用daoCtx.endTx方法)。

4.1.2.2将daoImpl加入daoCtx的过程为:以当前daoImpl填充一张从daoIface到DaoImpl实例的表;

4.2 调用stdDaoMgr.addContext方法将daoCtx添加到stdDaoMgr中的过程为:

4.2.1以当前daoCtx填充一张由id到DaoCtx实例的表;

4.2.2遍历daoCtx中存放的所有daoImpl,填充一张从daoIface到daoCtx的表和一张从Dao接口实例(即daoImpl中的proxy和daoInstance)到daoCtx的表;

5.客户以某DaoIface调用DaoMgr.getDao方法得到一个DaoIface实现类实例xxxYyyDao的过程为:

stdDaoMgr查找其从daoIface到daoCtx的表,得到当前daoIface所在daoCtx,然后调用daoCtx.getDao方法:

daoCtx查找其从daoIface到DaoImpl实例的表,得到daoImpl,返回其proxy字段;

6.隐式事务:

隐式事务中,客户每调用一个xxxYyyDao中方法时,都是一次完整的事务,因为xxxYyyDao是调用DaoMgr.getDao方法得到的,而根据5,其实xxxYyyDao是一个代理,又根据4.1.2.1.7,该代理会“在调用其委托方法前后分别调用daoCtx.startTx方法和commitTx方法(在finally块中还调用daoCtx.endTx方法)”。

6.1 daoCtx.startTx方法调用其txMgr字段的txMgr.startTx方法,该方法返回一个DaoTx实例daoTx,daoCtx将它放入一个线程变量中;

6.2 DaoIface实现类中,由于其一定继承自某个DaoTemplate,以调用其中的数据库访问方法,而这些数据库访问方法都会以自己作为参数调用daoMgr的getTx方法;该方法查找4.2.2中提到的从Dao接口实例到daoCtx的表,得到一个daoCtx,然后调用daoCtx.getTx;daoCtx.getTx将存储在线程变量中的daoTx实例返回;

6.3 daoTx实例包含数据库操作所需的关键元素,例如对于SqlMapDaoTx,其中就包含一个SqlMapClient实例,SqlMapDaoTemplate中的数据库访问方法(如insert,queryForList等)都是先调用daoMgr.getTx,得到daoTx实例,将其强制转化为SqlMapDaoTx实例,然后调用其getSqlMap方法得到SqlMapClient实例,再调用SqlMapClient实例中的相应方法;又如对于JDBC的情况,对应DaoTx为ConnectionDaoTx,该类包含一个,每次调用JdbcDaoTemplate方法的getConnection方法时,该方法都先调用daoMgr.getTx,得到daoTx实例,将其强制转化为ConnectionDaoTx实例,然后调用其getConnection方法得到其中的Connection实例,然后调用其中的相应方法。

6.4 daoCtx.commitTx方法调用其txMgr字段的txMgr.commitTx(daoTx)方法完成事务的提交。

6.5 daoCtx.endTx方法调用其txMgr字段的txMgr.endTx(daoTx)方法结束事务。

7.显式事务:

显式事务通常包括三个步骤:首先,调用daoMgr.startTx,然后调用xxxYyyDao中的方法,***调用daoMgr.commitTx。

7.1 daoMgr.startTx的工作非常简单,只是设置stdDaoMgr中标记显式事务的字段;

7.2 调用xxxYyyDao中的方法时,由于代理,将先调用daoCtx.startTx,此过程同6.1;

7.3 调用daoMgr.commitTx时,该方法最终调用的也是daoCtx.commitTx,请参考6.4
 
下面以一个问题的实现来完成本文的总结工作:如果要由我来实现iBATIS的DAO框架对于Hibernate的支持,我们应该如何实现?

Hibernate的核心在于Session,所有的数据库操作都可调用Session上的相应方法完成,所有考虑用于支持Hibernate的DaoTx实现应该是对Session的一个包装,该实现中有一个返回当前Session的getSession方法(当然也包括提交和回滚方法)。同样的,DaoTxMgr实现类的configure方法负责完成某个Session实例(session)的配置,startTx方法负责返回一个包装了当前session实例的DaoTx实例,commitTx方法将传入的daoTx实例强制转化后调用daoTx上的commit方法,rollbackTx方法将传入的daoTx实例强制转化后调用daoTx上的rollback方法。而HibernateDaoTemplate类的关键就在于其protected的getSession方法,该方法先调用daoMgr.getTx得到当前daoTx实例,强制转化后调用daoTx上的getSession方法即可。

查询iBATIS的源代码,发现与以上思路完全相同。

iBATIS DAO框架就向你介绍到这里,希望对你了解iBATIS DAO框架有所帮助。

【编辑推荐】

  1. iBATIS for Eclipse设置浅析
  2. iBATIS事务处理浅析
  3. iBatis和Hibernate的较量浅析
  4. iBATIS动态映射浅析
  5. iBATIS的自动代码生成工具Abator在Eclipse的应用
责任编辑:仲衡 来源: 中国IT实验室
相关推荐

2009-07-20 18:00:16

iBATIS DAO事

2009-07-16 17:01:32

ibatis dao

2009-07-21 11:17:46

iBATISDAO的配置

2009-07-20 14:56:18

iBATIS.NET动态选择DAO

2009-07-22 16:43:22

iBATIS框架iBATIS优化

2009-07-16 16:27:33

ibatis DAO

2009-07-21 13:08:08

iBATIS DAO

2009-07-21 11:12:00

iBATIS配置

2009-07-22 13:32:43

iBATIS DAO

2009-07-17 10:32:45

iBATIS MapB

2009-07-15 17:19:31

iBATIS Ecli

2009-07-22 10:03:11

iBATIS Resu

2009-07-15 17:58:07

iBATIS 动态映射

2009-07-22 10:42:59

iBATIS Cach

2009-07-16 10:23:30

iBATIS工作原理

2009-07-17 14:20:31

ibatis Dao

2009-07-17 17:05:44

iBATIS缓存cacheModel

2009-07-22 15:21:00

iBATIS SQLM

2009-07-16 13:08:09

iBATIS快速创建应

2009-07-15 16:42:03

iBATIS读写CLO
点赞
收藏

51CTO技术栈公众号