Transaction:Tx
Manager:Mgr
Context:Ctx
Interface:Iface
iBATIS DAO框架如图:
DAO的核心在于DaoManager,DaoManager的创建代码如下:
Reader reader = Resources.getResourceAsReader("dao.xml");
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 DAO是Java开发中的一个持久层框架,它提供了数据访问对象(DAO)的实现,使得数据库操作更加简单和灵活。在这个2.3.4.726版本的源码中,我们可以深入理解iBATIS DAO的工作原理,并通过添加注释来帮助我们更好...
本篇文章将详细介绍如何使用Abator工具搭建基于Ibatis的DAO框架。 Abator是一款自动化工具,它可以自动生成Java代码和SQL映射文件,大大简化了开发过程。下面我们将分步骤解析如何利用Abator来创建Ibatis DAO框架。...
iBatis DAO
ibatis dao 包ibatis dao 包ibatis dao 包ibatis dao 包ibatis dao 包ibatis dao 包ibatis dao 包ibatis dao 包ibatis dao 包ibatis dao 包
本资料“ibatisDao.rar”包含了一份对iBATIS DAO框架的深入分析,旨在帮助开发者更好地理解和应用这一技术。 在iBATIS中,DAO(Data Access Object)是数据库访问对象,它封装了对数据库的增删查改操作。DAO模式是...
`IBATISDAO`库类是基于IBATIS框架设计的一组用于简化数据库操作的类,它封装了与数据库交互的基本方法,让开发者能够更加高效地进行CRUD(创建、读取、更新、删除)操作。 **1. IBATIS框架基础** IBATIS的核心概念...
值得注意的是,DAO框架与iBATIS的SQL Maps框架是完全独立的,两者之间不存在依赖关系。这意味着开发者可以自由选择单独使用任何一个框架,或两者结合使用,以满足特定的应用需求。 #### DAO API的组成部分:关键类...
在Java开发中,Ibatis是一个流行的持久层框架,它提供了SQL映射功能,使得开发者能够更灵活地控制SQL语句的编写。本知识点主要聚焦于如何生成Ibatis的Dao(数据访问对象)类,以及相关的实体类(Entity)和SQL映射...
资源名称:iBATIS框架源码剖析内容简介:iBATIS是一种比较流行的ORM框架,本书全面介绍其结构体系和分析其源程序代码,该框架的核心包括两个组件,一个是iBATIS DAO,另一个是iBATIS SQL Map。本书分为三个部分,第...
iBatis技术框架介绍。ibatis2.x教程。
iBATIS DAO 2.2.0.638是一个特定版本的iBATIS框架,这个版本提供了对数据库操作的灵活支持,简化了SQL与Java代码的集成,使开发者能够更高效地处理数据库事务。 iBATIS的核心理念是将SQL语句直接写在XML配置文件中...
Ibatis,一个轻量级的Java持久层框架,正是DAO模式的一种实现,它提供了灵活的SQL映射机制,使得开发者能够更方便地将SQL查询与Java代码结合。下面我们将深入探讨Ibatis在DAO应用中的核心概念、工作原理以及实际应用...
例如,可以在同一DAO接口下实现基于iBATIS SQL Maps框架和Hibernate框架的不同数据访问逻辑,根据不同的场景或需求选择使用。 ### iBATIS DAO API的组成部分 iBATIS DAO API由一系列具有特定功能的类组成,它们...
**IBatis .NET框架实例详解** IBatis 是一个流行的数据访问层框架,它在Java世界中广为人知,但同样提供了对.NET平台的支持。本文将深入探讨如何在C# .NET环境中使用IBatis进行数据库操作,这对于初学者来说是一份...
通过对源码的深入分析,我们可以理解ibatis的核心机制,掌握数据库操作的底层原理,从而更好地利用和优化这个强大的持久层框架。在这个压缩包中,包含的文件是《ibatis框架源码剖析》的全文内容。 ibatis作为一个轻...
本教程聚焦于“IBATIS框架搭建”,它是一个流行的数据持久层框架,用于简化Java应用程序中的数据库操作。IBATIS的核心理念是将SQL语句与Java代码分离,提供灵活的映射机制,使得开发者能更好地控制SQL执行过程。 在...
本文将引导读者逐步将一个使用SQL Maps的应用转换为基于iBatis DAO框架的应用,并讨论DAO框架的构建、事务管理以及如何自定义事务管理模块。通过这个过程,读者可以深入理解iBatis DAO如何简化数据访问层的开发,...
### Struts+Spring+Ibatis整合框架搭建配置详解 在当今复杂的软件开发环境中,整合不同的框架以构建高效、可维护的应用程序变得尤为重要。Struts、Spring与Ibatis(现称MyBatis)作为三个功能互补的Java框架,它们...
ibatis-dao-2.jar gggggggggggg