iBatis DAO入門與進(jìn)階(http://www.matrix.org.cn/resource/article/44/44058_iBatis+DAO.html)
?iBatis DAO事務(wù)探索(http://www.aygfsteel.com/RongHao/archive/2006/01/20/28817.html)
今天繼續(xù)研究了JPetStore的持久層,其中由于看了一篇文章的誤導(dǎo),導(dǎo)致我對(duì)其中的事務(wù)處理深表懷疑。通過閱讀源代碼與看上面兩篇文章,對(duì)這個(gè)問題才認(rèn)識(shí)清楚。和我當(dāng)初預(yù)想的一致。
第一、持久層的研究
iBatis Dao的處理流程首先得到daoManager,它是通過文件配置的方式
配置文件為com.ibatis.jpetstore.persistence.dao.xml







這個(gè)配置文件將被com.ibatis.jpetstore.persistence.DaoConfig.java 調(diào)用得到系統(tǒng)的daoManager,整個(gè)過程也就是一個(gè)工廠模式。得到了daoManger,通過它來統(tǒng)一管理對(duì)數(shù)據(jù)庫(kù)的操作。
為了使用ibatis的DAO對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,
首先是定義了一批接口類,位于包:com.ibatis.jpetstore.persistence.iface 。然后是一批實(shí)現(xiàn)這個(gè)接口類,位于包:com.ibatis.jpetstore.persistence.sqlmapdao
這些所有實(shí)現(xiàn)類繼承與sqlMapDaoTemplate,如下:


























最后在業(yè)務(wù)邏輯層com.ibatis.jpetstore.service調(diào)用持久層完成對(duì)數(shù)據(jù)庫(kù)的訪問。




















然后通過這些實(shí)現(xiàn)類進(jìn)行數(shù)據(jù)庫(kù)訪問操作。如在OrderService下:





















其中還值得注意的是,在各個(gè)實(shí)現(xiàn)類中ItemSqlMapDao并不包含對(duì)事務(wù)的處理,所有對(duì)于事務(wù)的處理都是在業(yè)務(wù)邏輯層調(diào)用。這樣做的好處在于所有Dao的操作都是原子操作,方便進(jìn)行各種業(yè)務(wù)邏輯的組裝。(以前,我設(shè)計(jì)時(shí)候,這個(gè)地方?jīng)]有設(shè)計(jì)好)
第二、事務(wù)處理的研究
此處涉及到了事務(wù)的處理,來分析一下事務(wù)處理的過程。
首先看一個(gè)事務(wù)處理的時(shí)序圖
從這張時(shí)序圖可以看到事務(wù)的處理是由代理類DataProxy完成的,查看DataProxy的代碼





























































根據(jù)這段代碼應(yīng)該很清楚的知道Dao框架采用AOP模式,截獲所調(diào)用的方法,并檢查事務(wù)處理是否已經(jīng)顯式的開始執(zhí)行,如果沒有,它將調(diào)用事務(wù)管理器中的startTransaction()創(chuàng)建一個(gè)新的事務(wù)處理調(diào)用,然后執(zhí)行被截獲的方法,然后commitTransaction。如果有,則直接執(zhí)行所調(diào)用的方法。
所以,在此Dao框架下,所有沒有顯式的通過startTransaction調(diào)用事務(wù)的方法,都是一個(gè)獨(dú)立的事務(wù)。如果要想在一個(gè)事務(wù)中完成幾次調(diào)用,必須自己通過DaoMangaer手動(dòng)處理事務(wù)。
至此,ibatis的JpetshopStore的持久層運(yùn)行機(jī)制以及ibatis的Dao框架事務(wù)處理研究完畢。