MyBatis3整合Spring3的Transaction事務處理

正如第二版,Spring 僅支持 iBatis2。那麼我們就想將 MyBatis3 的支持加入到 Spring3.0(參考 Spring 的 Jira 的問題)中。

不幸的是,Spring 3.0 的開發在 MyBatis 3.0 官方發佈前就結束了。因爲Spring開發團隊不想發佈一個基於非發行版的MyBatis的整合支持,

那麼 Spring官方的支持就不得不等到至少 3.1 版本了。要在 Spring 中支持 MyBatis,MyBatis 社區認爲現在應該是自己團結貢獻者和有興趣的人

一起來開始進行 Spring 和 MyBatis 整合的時候了。 這個小類庫就來創建丟失的粘貼 Spring 和 MyBtatis 這兩個流行框架的膠水。

減少用戶不得不來配置MyBatis和Spring 3.X上下文環境的樣板和冗餘代碼。 它還透明地增加了 Spring對 MyBatis 事務的支持。

所以儘管MyBatis3提供了對Spring的整合,但是org.springframework.jdbc.datasource.DataSourceTransactionManager這個事務管理器還是不支持

aop的事務管理方式,如果你還想設置你的事務的隔離級別、只讀(PROPAGATION_REQUIRED、ISOLATION_DEFAULT、readOnly、timeout)。

那麼你可以使用org.springframework.transaction.interceptor.TransactionProxyFactoryBean這個事務攔截器的代理工廠。它還是可以完成的,但是當然不會

有HibernateTransactionManager那樣的完美,因爲DataSourceTransactionManager不能使用aop來管理我們的事務。

基本配置如下:

<-- 配置事務管理器,注意這裏的dataSource和SqlSessionFactoryBean的dataSource要一致,不然事務就沒有作用了 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
 
<-- 配置事務的傳播特性 -->
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
    <property name="transactionManager" ref="transactionManager" />
    <property name="transactionAttributes">
        <props>
            <prop key="add*">PROPAGATION_REQUIRED</prop>
            <prop key="edit*">PROPAGATION_REQUIRED</prop>
            <prop key="remove*">PROPAGATION_REQUIRED</prop>
            <prop key="insert*">PROPAGATION_REQUIRED</prop>
            <prop key="update*">PROPAGATION_REQUIRED</prop>
            <prop key="del*">PROPAGATION_REQUIRED</prop>
            <prop key="*">readOnly</prop>
        </props>
    </property>
</bean>

然後,你需要配置的是對那個類的進行攔截器事務管理,就就需要設置這個接口的parent屬性爲baseTransactionProxy,target是該接口的實現類。如下:

<-- 爲AccountBiz接口配置事務攔截器,baseTransactionProxy是事務攔截器,在Controller中獲取這個對象 -->
<bean id="accountBiz" parent="baseTransactionProxy">
    <-- 設置target,也就是AccountBiz的實現類 -->
    <property name="target" ref="accountBizImpl"/>
</bean>

上面的accountBiz是一個接口,它的實現類的id是accountBizImpl。然後你在Struts或SpringMVC中注入accountBiz這個接口即可使用裏面的方法了。

糟糕的是,你需要爲所有需要事務管理的類或接口都要進行這個配置!也許你可以配置一個BaseBiz的parent是baseTransactionProxy,然後所有要進行

事務管理的接口或類,繼承或實現BaseBiz這個接口。不妨可以嘗試一番!

發佈了204 篇原創文章 · 獲贊 7 · 訪問量 95萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章