自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iBATIS DAO框架淺析

開發(fā) 后端
iBATIS DAO框架是什么概念?iBATIS DAO的常用字段又是哪些呢?本文將會給你一一介紹。

iBATIS DAO框架的書寫方便,本文采用如下簡寫約定:

◆Transaction:Tx

◆Manager:Mgr

◆Context:Ctx

◆Interface:Iface

iBATIS DAO框架如圖:

iBATIS DAO框架圖 

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

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

DaoManager是接口,查看DaoManagerBuilder源代碼可發(fā)現(xiàn),其buildDaoManager方法返回的是一個StandardDaoManager實例。buildDaoManager方法調(diào)用了XmlDaoManagerBuilder類的buildDaoManager方法,該方法完成如下工作:

1.創(chuàng)建一個StandardDaoManager實例stdDaoMgr;

2.創(chuàng)建一個用于全局收集各種property(來自<properties>元素指向的資源文件或來自當(dāng)前dao.xml中的各級<property>元素)的Properties對象;

3.解析dao.xml文件(建議閱讀本文時參考一份dao.xml文件,如JGameStore應(yīng)用中給出的dao.xml)中的<properties>元素,將相應(yīng)property加入;

4.解析dao.xml文件中的<context>元素,得到一個DaoContext實例daoCtx(4.1);并將調(diào)用stdDaoMgr.addContext方法將daoCtx添加到stdDaoMgr中(4.2):

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

實例化一個DaoContext對象daoCtx;

將其daoManager字段設(shè)為我們的stdDaoMgr;

如<context>有id屬性,則將daoCtx的id字段取為此屬性的值;

解析<context>的子元素:

4.1.1解析<txMgr>子元素,得到DaoTxMgr接口實例txMgr,設(shè)為daoCtx的相應(yīng)字段,解析過程為:

根據(jù)<txMgr>子元素的type屬性,實例化一個相應(yīng)的DaoTxMgr實例txMgr;

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

根據(jù)properties對txMgr進(jìn)行配置(即調(diào)用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字段設(shè)為我們的stdDaoMgr;

4.1.2.1.3將daoImpl的daoCtx字段設(shè)為我們的daoCtx;

4.1.2.1.4將daoImpl的daoIface字段設(shè)為<dao>的iface屬性值對應(yīng)的class;

4.1.2.1.5將daoImpl的daoImplementation字段設(shè)為<dao>的implementation屬性值對應(yīng)的class;

4.1.2.1.6根據(jù)implementation屬性實例化一個DAO實現(xiàn)類,設(shè)為daoInstance字段值,注意,該實例一定是一個Dao接口實例,因為任何一個都繼承自DaoTemplate,而DaoTemplate實現(xiàn)了Dao接口;

4.1.2.1.7創(chuàng)建一個當(dāng)前DAO實現(xiàn)類的代理,設(shè)為daoImpl的proxy字段值,該代理在啟用顯式事務(wù)時會在調(diào)用委托方法前調(diào)用daoCtx.startTx方法;在使用隱式事務(wù)時則在調(diào)用委托方法的前后分別調(diào)用daoCtx.startTx方法和commitTx方法(在finally塊中還調(diào)用daoCtx.endTx方法)。

4.1.2.2將daoImpl加入daoCtx的過程為:以當(dāng)前daoImpl填充一張從daoIface到DaoImpl實例的表;

4.2 調(diào)用stdDaoMgr.addContext方法將daoCtx添加到stdDaoMgr中的過程為:

4.2.1以當(dāng)前daoCtx填充一張由id到DaoCtx實例的表;

4.2.2遍歷daoCtx中存放的所有daoImpl,填充一張從daoIface到daoCtx的表和一張從Dao接口實例(即daoImpl中的proxy和daoInstance)到daoCtx的表;

5.客戶以某DaoIface調(diào)用DaoMgr.getDao方法得到一個DaoIface實現(xiàn)類實例xxxYyyDao的過程為:

stdDaoMgr查找其從daoIface到daoCtx的表,得到當(dāng)前daoIface所在daoCtx,然后調(diào)用daoCtx.getDao方法:

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

6.隱式事務(wù):

隱式事務(wù)中,客戶每調(diào)用一個xxxYyyDao中方法時,都是一次完整的事務(wù),因為xxxYyyDao是調(diào)用DaoMgr.getDao方法得到的,而根據(jù)5,其實xxxYyyDao是一個代理,又根據(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方法,該方法返回一個DaoTx實例daoTx,daoCtx將它放入一個線程變量中;

6.2 DaoIface實現(xiàn)類中,由于其一定繼承自某個DaoTemplate,以調(diào)用其中的數(shù)據(jù)庫訪問方法,而這些數(shù)據(jù)庫訪問方法都會以自己作為參數(shù)調(diào)用daoMgr的getTx方法;該方法查找4.2.2中提到的從Dao接口實例到daoCtx的表,得到一個daoCtx,然后調(diào)用daoCtx.getTx;daoCtx.getTx將存儲在線程變量中的daoTx實例返回;

6.3 daoTx實例包含數(shù)據(jù)庫操作所需的關(guān)鍵元素,例如對于SqlMapDaoTx,其中就包含一個SqlMapClient實例,SqlMapDaoTemplate中的數(shù)據(jù)庫訪問方法(如insert,queryForList等)都是先調(diào)用daoMgr.getTx,得到daoTx實例,將其強制轉(zhuǎn)化為SqlMapDaoTx實例,然后調(diào)用其getSqlMap方法得到SqlMapClient實例,再調(diào)用SqlMapClient實例中的相應(yīng)方法;又如對于JDBC的情況,對應(yīng)DaoTx為ConnectionDaoTx,該類包含一個,每次調(diào)用JdbcDaoTemplate方法的getConnection方法時,該方法都先調(diào)用daoMgr.getTx,得到daoTx實例,將其強制轉(zhuǎn)化為ConnectionDaoTx實例,然后調(diào)用其getConnection方法得到其中的Connection實例,然后調(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ù)通常包括三個步驟:首先,調(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中的方法時,由于代理,將先調(diào)用daoCtx.startTx,此過程同6.1;

7.3 調(diào)用daoMgr.commitTx時,該方法最終調(diào)用的也是daoCtx.commitTx,請參考6.4
 
下面以一個問題的實現(xiàn)來完成本文的總結(jié)工作:如果要由我來實現(xiàn)iBATIS的DAO框架對于Hibernate的支持,我們應(yīng)該如何實現(xiàn)?

Hibernate的核心在于Session,所有的數(shù)據(jù)庫操作都可調(diào)用Session上的相應(yīng)方法完成,所有考慮用于支持Hibernate的DaoTx實現(xiàn)應(yīng)該是對Session的一個包裝,該實現(xiàn)中有一個返回當(dāng)前Session的getSession方法(當(dāng)然也包括提交和回滾方法)。同樣的,DaoTxMgr實現(xiàn)類的configure方法負(fù)責(zé)完成某個Session實例(session)的配置,startTx方法負(fù)責(zé)返回一個包裝了當(dāng)前session實例的DaoTx實例,commitTx方法將傳入的daoTx實例強制轉(zhuǎn)化后調(diào)用daoTx上的commit方法,rollbackTx方法將傳入的daoTx實例強制轉(zhuǎn)化后調(diào)用daoTx上的rollback方法。而HibernateDaoTemplate類的關(guān)鍵就在于其protected的getSession方法,該方法先調(diào)用daoMgr.getTx得到當(dāng)前daoTx實例,強制轉(zhuǎn)化后調(diào)用daoTx上的getSession方法即可。

查詢iBATIS的源代碼,發(fā)現(xiàn)與以上思路完全相同。

iBATIS DAO框架就向你介紹到這里,希望對你了解iBATIS DAO框架有所幫助。

【編輯推薦】

  1. iBATIS for Eclipse設(shè)置淺析
  2. iBATIS事務(wù)處理淺析
  3. iBatis和Hibernate的較量淺析
  4. iBATIS動態(tài)映射淺析
  5. iBATIS的自動代碼生成工具Abator在Eclipse的應(yīng)用
責(zé)任編輯:仲衡 來源: 中國IT實驗室
相關(guān)推薦

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動態(tài)選擇DAO

2009-07-22 16:43:22

iBATIS框架iBATIS優(yōu)化

2009-07-21 11:12:00

iBATIS配置

2009-07-21 13:08:08

iBATIS DAO

2009-07-16 16:27:33

ibatis DAO

2009-07-15 17:58:07

iBATIS 動態(tài)映射

2009-07-16 10:23:30

iBATIS工作原理

2009-07-22 10:42:59

iBATIS Cach

2009-07-22 13:32:43

iBATIS DAO

2009-07-17 10:32:45

iBATIS MapB

2009-07-22 10:03:11

iBATIS Resu

2009-07-15 17:19:31

iBATIS Ecli

2009-07-17 14:20:31

ibatis Dao

2009-07-22 16:02:14

iBATIS參數(shù)

2009-07-17 10:59:59

iBATIS接口

2009-07-17 09:44:40

iBATIS教程

2009-07-22 15:01:01

iBATIS SQLM
點贊
收藏

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