中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解析iBATIS DAO框架

發布時間:2021-12-18 20:18:21 來源:億速云 閱讀:130 作者:柒染 欄目:編程語言

如何解析iBATIS DAO框架,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

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

◆Transaction:Tx

◆Manager:Mgr

◆Context:Ctx

◆Interface:Iface

iBATIS DAO框架如圖:

如何解析iBATIS DAO框架

iBATIS 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的源代碼,發現與以上思路完全相同。

看完上述內容,你們掌握如何解析iBATIS DAO框架的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿鲁科尔沁旗| 伊通| 获嘉县| 福鼎市| 丹阳市| 宁安市| 泽普县| 黑水县| 汶川县| 临沭县| 门源| 罗山县| 唐山市| 全南县| 大足县| 福建省| 晋州市| 文水县| 清水河县| 涡阳县| 襄汾县| 汾西县| 华蓥市| 从化市| 宜昌市| 平潭县| 罗城| 海口市| 临海市| 越西县| 郁南县| 新巴尔虎左旗| 满城县| 玉林市| 山阴县| 都匀市| 抚宁县| 赣榆县| 鲁山县| 云阳县| 平南县|