成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分析ibatis dao框架

開發(fā) 后端
想要學(xué)好ibatis dao的話,我們首先要了解ibatis dao的框架,本文就是幫您分析并理解ibatis dao的框架。希望您看完了本文,能夠?qū)batis dao框架有一個(gè)基本的了解。

為書寫方便,本文采用如下簡寫約定:

       TransactionTx

       ManagerMgr

       ContextCtx

       InterfaceIface

 ibatis dao框架如圖:

 

 

DAO的核心在于DaoManager,DaoManager的創(chuàng)建代碼如下:

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


DaoManager是接口,查看DaoManagerBuilder源代碼可發(fā)現(xiàn),其buildDaoManager方法返回的是一個(gè)StandardDaoManager實(shí)例。buildDaoManager方法調(diào)用了XmlDaoManagerBuilder類的buildDaoManager方法,該方法完成如下工作:
1. 創(chuàng)建一個(gè)StandardDaoManager實(shí)例stdDaoMgr;
2. 創(chuàng)建一個(gè)用于全局收集各種property(來自元素指向的資源文件或來自當(dāng)前dao.xml中的各級元素)的Properties對象;
3. 解析dao.xml文件(建議閱讀本文時(shí)參考一份dao.xml文件,如JGameStore應(yīng)用中給出的dao.xml)中的元素,將相應(yīng)property加入;
4. 解析dao.xml文件中的元素,得到一個(gè)DaoContext實(shí)例daoCtx(4.1);并將調(diào)用stdDaoMgr.addContext方法將daoCtx添加到stdDaoMgr中(4.2):
4.1 解析dao.xml文件的元素得到daoCtx的過程為:
實(shí)例化一個(gè)DaoContext對象daoCtx;
將其daoManager字段設(shè)為我們的stdDaoMgr;
有id屬性,則將daoCtx的id字段取為此屬性的值;
解析的子元素:
4.1.1解析子元素,得到DaoTxMgr接口實(shí)例txMgr,設(shè)為daoCtx的相應(yīng)字段,解析過程為:
根據(jù)子元素的type屬性,實(shí)例化一個(gè)相應(yīng)的DaoTxMgr實(shí)例txMgr;
解析子元素,將所得property添加入properties;
根據(jù)properties對txMgr進(jìn)行配置(即調(diào)用txMgr.configure方法);
4.1.2解析子元素,得到一個(gè)DaoImpl類實(shí)例daoImpl,然后將其加入daoCtx;
4.1.2.1解析過程為:
4.1.2.1.1實(shí)例化一個(gè)DaoImpl類實(shí)例daoImpl;
4.1.2.1.2將daoImpl的daoMgr字段設(shè)為我們的stdDaoMgr;
4.1.2.1.3將daoImpl的daoCtx字段設(shè)為我們的daoCtx;
4.1.2.1.4將daoImpl的daoIface字段設(shè)為的iface屬性值對應(yīng)的class;
4.1.2.1.5將daoImpl的daoImplementation字段設(shè)為的implementation屬性值對應(yīng)的class;
4.1.2.1.6根據(jù)implementation屬性實(shí)例化一個(gè)DAO實(shí)現(xiàn)類,設(shè)為daoInstance字段值,注意,該實(shí)例一定是一個(gè)Dao接口實(shí)例,因?yàn)槿魏我粋€(gè)都繼承自DaoTemplate,而DaoTemplate實(shí)現(xiàn)了Dao接口;
4.1.2.1.7創(chuàng)建一個(gè)當(dāng)前DAO實(shí)現(xiàn)類的代理,設(shè)為daoImpl的proxy字段值,該代理在啟用顯式事務(wù)時(shí)會在調(diào)用委托方法前調(diào)用daoCtx.startTx方法;在使用隱式事務(wù)時(shí)則在調(diào)用委托方法的前后分別調(diào)用daoCtx.startTx方法和commitTx方法(在finally塊中還調(diào)用daoCtx.endTx方法)。
4.1.2.2將daoImpl加入daoCtx的過程為:以當(dāng)前daoImpl填充一張從daoIface到DaoImpl實(shí)例的表;
4.2 調(diào)用stdDaoMgr.addContext方法將daoCtx添加到stdDaoMgr中的過程為:
4.2.1以當(dāng)前daoCtx填充一張由id到DaoCtx實(shí)例的表;
4.2.2遍歷daoCtx中存放的所有daoImpl,填充一張從daoIface到daoCtx的表和一張從Dao接口實(shí)例(即daoImpl中的proxy和daoInstance)到daoCtx的表;
5. 客戶以某DaoIface調(diào)用DaoMgr.getDao方法得到一個(gè)DaoIface實(shí)現(xiàn)類實(shí)例xxxYyyDao的過程為:
stdDaoMgr查找其從daoIface到daoCtx的表,得到當(dāng)前daoIface所在daoCtx,然后調(diào)用daoCtx.getDao方法:
    daoCtx查找其從daoIface到DaoImpl實(shí)例的表,得到daoImpl,返回其proxy字段;
6. 隱式事務(wù):
隱式事務(wù)中,客戶每調(diào)用一個(gè)xxxYyyDao中方法時(shí),都是一次完整的事務(wù),因?yàn)閤xxYyyDao是調(diào)用DaoMgr.getDao方法得到的,而根據(jù)5,其實(shí)xxxYyyDao是一個(gè)代理,又根據(jù)4.1.2.1.7,該代理會“在調(diào)用其委托方法前后分別調(diào)用daoCtx.startTx方法和commitTx方法(在finally塊中還調(diào)用daoCtx.endTx方法)”。
6.1 daoCtx.startTx方法調(diào)用其txMgr字段的txMgr.startTx方法,該方法返回一個(gè)DaoTx實(shí)例daoTx,daoCtx將它放入一個(gè)線程變量中;
6.2 DaoIface實(shí)現(xiàn)類中,由于其一定繼承自某個(gè)DaoTemplate,以調(diào)用其中的數(shù)據(jù)庫訪問方法,而這些數(shù)據(jù)庫訪問方法都會以自己作為參數(shù)調(diào)用daoMgr的getTx方法;該方法查找4.2.2中提到的從Dao接口實(shí)例到daoCtx的表,得到一個(gè)daoCtx,然后調(diào)用daoCtx.getTx;daoCtx.getTx將存儲在線程變量中的daoTx實(shí)例返回;
6.3 daoTx實(shí)例包含數(shù)據(jù)庫操作所需的關(guān)鍵元素,例如對于SqlMapDaoTx,其中就包含一個(gè)SqlMapClient實(shí)例,SqlMapDaoTemplate中的數(shù)據(jù)庫訪問方法(如insert,queryForList等)都是先調(diào)用daoMgr.getTx,得到daoTx實(shí)例,將其強(qiáng)制轉(zhuǎn)化為SqlMapDaoTx實(shí)例,然后調(diào)用其getSqlMap方法得到SqlMapClient實(shí)例,再調(diào)用SqlMapClient實(shí)例中的相應(yīng)方法;又如對于JDBC的情況,對應(yīng)DaoTx為ConnectionDaoTx,該類包含一個(gè),每次調(diào)用JdbcDaoTemplate方法的getConnection方法時(shí),該方法都先調(diào)用daoMgr.getTx,得到daoTx實(shí)例,將其強(qiáng)制轉(zhuǎn)化為ConnectionDaoTx實(shí)例,然后調(diào)用其getConnection方法得到其中的Connection實(shí)例,然后調(diào)用其中的相應(yīng)方法。
6.4 daoCtx.commitTx方法調(diào)用其txMgr字段的txMgr.commitTx(daoTx)方法完成事務(wù)的提交。
6.5 daoCtx.endTx方法調(diào)用其txMgr字段的txMgr.endTx(daoTx)方法結(jié)束事務(wù)。
7. 顯式事務(wù):
顯式事務(wù)通常包括三個(gè)步驟:首先,調(diào)用daoMgr.startTx,然后調(diào)用xxxYyyDao中的方法,最后調(diào)用daoMgr.commitTx。
7.1 daoMgr.startTx的工作非常簡單,只是設(shè)置stdDaoMgr中標(biāo)記顯式事務(wù)的字段;
7.2 調(diào)用xxxYyyDao中的方法時(shí),由于代理,將先調(diào)用daoCtx.startTx,此過程同6.1;
7.3 調(diào)用daoMgr.commitTx時(shí),該方法最終調(diào)用的也是daoCtx.commitTx,請參考6.4
 
下面以一個(gè)問題的實(shí)現(xiàn)來完成本文的總結(jié)工作:如果要由我來實(shí)現(xiàn)ibatis的DAO框架對于Hibernate的支持,我們應(yīng)該如何實(shí)現(xiàn)?
Hibernate的核心在于Session,所有的數(shù)據(jù)庫操作都可調(diào)用Session上的相應(yīng)方法完成,所有考慮用于支持Hibernate的DaoTx實(shí)現(xiàn)應(yīng)該是對Session的一個(gè)包裝,該實(shí)現(xiàn)中有一個(gè)返回當(dāng)前Session的getSession方法(當(dāng)然也包括提交和回滾方法)。同樣的,DaoTxMgr實(shí)現(xiàn)類的configure方法負(fù)責(zé)完成某個(gè)Session實(shí)例(session)的配置,startTx方法負(fù)責(zé)返回一個(gè)包裝了當(dāng)前session實(shí)例的DaoTx實(shí)例,commitTx方法將傳入的daoTx實(shí)例強(qiáng)制轉(zhuǎn)化后調(diào)用daoTx上的commit方法,rollbackTx方法將傳入的daoTx實(shí)例強(qiáng)制轉(zhuǎn)化后調(diào)用daoTx上的rollback方法。而HibernateDaoTemplate類的關(guān)鍵就在于其protected的getSession方法,該方法先調(diào)用daoMgr.getTx得到當(dāng)前daoTx實(shí)例,強(qiáng)制轉(zhuǎn)化后調(diào)用daoTx上的getSession方法即可。
查詢ibatis的源代碼,發(fā)現(xiàn)與以上思路完全相同。

【編輯推薦】

  1. ibatis官方提示文檔中的錯(cuò)誤
  2. ibtis配置之添加ibatis Dao支持
  3. 探索的ibatis DAO事務(wù)管理模塊
  4. ibatis DAO入門進(jìn)階寶典
  5. ibtis了解iBatis.Net中的ResultMap
責(zé)任編輯:桑丘 來源: LeafInWind的blog
相關(guān)推薦

2009-07-16 09:14:26

iBATIS DAO

2009-07-20 18:00:16

iBATIS DAO事

2009-07-16 16:27:33

ibatis DAO

2009-07-21 13:08:08

iBATIS DAO

2009-07-22 13:32:43

iBATIS DAO

2009-07-17 14:20:31

ibatis Dao

2009-07-21 11:17:46

iBATISDAO的配置

2009-07-17 14:03:34

ibatis DAO事務(wù)管理

2009-07-20 14:56:18

iBATIS.NET動態(tài)選擇DAO

2009-07-22 16:43:22

iBATIS框架iBATIS優(yōu)化

2009-07-20 09:27:42

IBATIS.netDAO

2009-07-24 16:42:46

iBatis框架做ba

2009-10-29 09:34:40

DAO.NET Da

2009-08-20 10:11:50

Java持久層框架iBATIS 3

2009-07-21 16:49:41

整合iBatis和SpSqlMapClien

2009-07-16 09:56:32

什么是iBATIS

2009-07-15 15:47:49

iBATIS是什么

2009-07-21 11:12:00

iBATIS配置

2009-06-15 09:57:46

HibernateIBatis

2009-07-16 11:21:19

ibatis主鍵自動生成
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久一日本道色综合久久 | 99久久精品免费看国产四区 | 99精品国产一区二区青青牛奶 | 免费视频成人国产精品网站 | 成年人在线观看 | 中国av在线免费观看 | 亚洲最新在线 | 国产一区二区三区在线 | 国产亚洲一区精品 | 欧美成人一级视频 | 亚洲精品无人区 | 亚洲精品视频二区 | 成人国内精品久久久久一区 | 欧美一级二级视频 | 久久伊人在 | 亚洲一区二区精品 | 国产三级电影网站 | 福利视频亚洲 | 国产精品美女久久久久久久网站 | 日韩在线不卡视频 | 超碰97干| 欧美午夜精品 | 特级生活片 | 亚洲欧美日韩精品久久亚洲区 | 黄色大片视频 | 91麻豆精品国产91久久久久久久久 | 久久精品亚洲精品国产欧美 | 一区二区三区免费 | 亚洲精品一级 | 日韩视频免费看 | 日本在线观看视频 | 97精品超碰一区二区三区 | 亚洲成人精品 | 狠狠亚洲| 欧美一级久久 | 国户精品久久久久久久久久久不卡 | 极品一区| 午夜视频在线免费观看 | 老头搡老女人毛片视频在线看 | 国产成人精品久久 | 国产精品久久久久久久久免费相片 |