ibatis框架和mybatis框架(ibatis接口mapper怎么写)

技术如何解析iBATIS DAO框架如何解析iBATIS DAO框架,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。iBATIS DAO框架的书写方便,项目采

如何分析iBATIS DAO框架,相信很多没有经验的人都不知所措。因此,本文总结了问题产生的原因及解决方法。希望你能通过这篇文章解决这个问题。

IBADAO框架易于编写,项目采用了以下缩写:

交易:发送

经理:经理

上下文:Ctx

接口:Iface

Ibadao框架如图所示:

如何解析iBATIS  DAO框架

Ibadao的核心在于DaoManager,其创建代码如下:

reader reader=resources . getresourceasreader(' Dao . XML ');DaoManagerdaoMngr=daomanagerbuilder . builddaomanager(reader);DaoManager是接口。查看DaoManagerBuilder的源代码,我们可以发现它的buildDaoManager方法返回一个StandardDaoManager实例。buildDaoManager方法调用XmlDaoManagerBuilder类的buildDaoManager方法,完成以下工作:

1.创建标准数据管理器实例标准数据管理器;

2.创建一个properties对象,用于全局收集所有类型的属性(从Properties元素指向的资源文件或从当前dao.xml中所有级别的属性元素);

3.解析dao.xml文件中的properties元素(阅读本文时建议参考一个dao.xml文件,比如JGameStore应用中给出的dao.xml)并添加相应的properties;

4.分析dao.xml文件中的上下文元素,得到DaoContext实例DAO CTX(4.1);并调用stdDaoMgr.addContext方法将daoCtx添加到stdDaoMgr (4.2)中:

4.1解析dao.xml文件的上下文元素得到daoCtx的过程如下:

实例化一个DaoContext对象daoCtx;

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

如果上下文有id属性,则取daoCtx的id字段作为该属性的值;

分析上下文的子元素:

4.1.1分析txMgr子元素,得到DaoTxMgr的接口实例txMgr,设置为daoCtx的对应字段。分析过程如下:

根据txMgr子元素的类型属性,实例化对应的DaoTxMgr实例Txmgr;

解析txMgr的属性子元素,将获取的属性添加到属性中;

根据属性配置txMgr(即调用txMgr.configure方法);

4.1.2分析dao子元素得到一个DaoImpl类实例,然后添加到daoCtx;

4.1.2.1的分析过程是:

4.1.2.1.1实例化一个DaoImpl类实例Dao impl;

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

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

4.1.2.1.4将daoImpl的daoIface字段设置为类;对应于dao的iface属性值;

4.1.2.1.5将daoImpl的Dao implement字段设置为类;对应于dao的实现属性值;

4.1.2.1.6根据实现属性实例化一个Dao实现类,并将其设置为daoInstance字段的值。注意,这个实例必须是DAO接口实例,因为任何一个都是从DaoTemplate继承的,Dao template实现Dao接口;

4.1.2.1.7创建当前DAO实现类的代理,并将其设置为daoImpl的代理字段的值。当显式事务被启用时,代理将在调用委托方法之前调用daoCtx.startTx方法;当使用隐式事务时,在调用委托方法之前和之后调用daoCtx.startTx方法和commitTx方法(daoCtx.endTx方法也在finally块中调用)。

将4.1.2.2 daoImpl添加到daoCtx的过程如下:用当前daoImpl填充daoIface到Dao impl实例的表;

4.2呼叫stdDaoMgr.addConte

xt方法将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框架的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/151903.html

(0)

相关推荐

  • 怎么进行IE6、IE7、IE8三大浏览器兼容性对比

    技术怎么进行IE6、IE7、IE8三大浏览器兼容性对比本篇文章给大家分享的是有关怎么进行IE6、IE7、IE8三大浏览器兼容性对比,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟

    攻略 2021年11月25日
  • Docker-端口映射

    技术Docker-端口映射 Docker-端口映射Docker-端口映射
    Docker端口映射
    docker容器在启动的时候,如果不指定端口映射参数,在容器外部是无法通过网络来访问容器内的网络应用和服务

    礼包 2021年12月6日
  • 中药蜜丸的制作方法,中药密丸的制作方法谁知道呀?

    技术中药蜜丸的制作方法,中药密丸的制作方法谁知道呀?蜜丸制作方法中药蜜丸的制作方法: 1、蜂蜜用量:一般药粉与炼蜜的比例是10:3,炼蜜与水的比例为1:3。药粉的粘性的大小不同改变蜜水浓度与用蜜量。
    2、制作步骤:

    生活 2021年10月29日
  • 铁与稀盐酸反应的化学方程式,用稀盐酸除铁锈的化学反应方程式

    技术铁与稀盐酸反应的化学方程式,用稀盐酸除铁锈的化学反应方程式铁锈的主要成分是氧化铁(fe2o3)铁与稀盐酸反应的化学方程式,将生锈的铁钉放入稀盐酸中,先是表面的铁锈的主要成分氧化铁与盐酸反应生成氯化铁与水,反应现象为:

    生活 2021年10月23日
  • 徒以有先生也的以是什么意思,长跪而谢之中的而是什么意思

    技术徒以有先生也的以是什么意思,长跪而谢之中的而是什么意思1徒以有先生也的以是什么意思、而,承接词,然后2、整句意思是:直身而跪向唐雎道歉说。3、出自西汉刘向《唐雎不辱使命》,原文选段:唐雎曰:“此庸夫之怒也,非士之怒也

    生活 2021年10月23日
  • Linux下Tomcat怎样进行以非root用户执行特权操作

    技术Linux下Tomcat怎样进行以非root用户执行特权操作今天就跟大家聊聊有关Linux下Tomcat怎样进行以非root用户执行特权操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大

    攻略 2021年12月8日