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







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


























最后在業務邏輯層com.ibatis.jpetstore.service調用持久層完成對數據庫的訪問。




















然后通過這些實現類進行數據庫訪問操作。如在OrderService下:





















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





























































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