在MyBatis API中使用Spring Transactions

时间:2013-06-14 07:19:07

标签: spring transactions mybatis

我们使用Mybatis开发了一个数据持久性框架。该框架使用普通的MyBatis API。 (我们被禁止使用任何mybatis弹簧,不要问......为什么?) 现在我们必须将此持久性框架与其他团队开发的另一个框架集成。这个其他框架大量使用spring transaction来处理所有事情。我们的持久框架DAO将由其框架在其自己的API中使用...这意味着Spring管理的事务将传播到MyBatis DAO。我们希望基于MyBatis的持久性框架能够毫无问题地参与Spring管理的事务。

我们有两种方法可以完成这项工作  (1)更改我们的持久框架以使用mybatis-spring模块。更改DAO以使用使用spring和spring的SqlSessionFactoryBean直接注入的映射器。我确实构建了一个模拟框架的小例子,一切都可以正常工作。问题在于这种方法需要改变几乎所有DAO以使用弹簧注入映射器,再次广泛地测试框架。由于交货时间表,我们根本没有时间。

(2)使用mybatis-spring,使用spring定义SqlSeeionFactory - 设置其他框架使用的数据源和事务管理器。像

这样的东西
    <bean id="smpDataSource" class="oracle.jdbc.pool.OracleDataSource"                                destroy-method="close">
    <property name="connectionCachingEnabled" value="true" />
    <property name="URL"> <value>${db.thin.url}</value></property>
    <property name="user"> <value>${db.user}</value></property>
    <property name="password"><value>${db.password}</value>
    </property>
</bean>
   <bean id="dbTransactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource" ref="smpDataSource" />
   </bean>



<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="smpDataSource" />
    <property name="typeAliasesPackage" value="spike.smp51.domain" />
    <property name="mapperLocations" value="classpath*:spike/smp51/mappers/*.xml"          </bean>

然后在应用程序代码中,MyBatis DAO从spring获取sqlseesionfactory

      public static SqlSessionFactory getSqlSessionFactory() throws Exception 
   {

    DefaultSqlSessionFactory sessionFactory =           (DefaultSqlSessionFactory)ctx.getBean("sqlSessionFactory");
    return sessionFactory;

 }

所有DAO都已使用SqlSeesionFactory来打开和关闭会话。只需用spring创建的sqlseeionfactory替换mybatis创建的sqlseeionfactory即可。这样我们只有几行变化。 这里概述了这种方法 http://mybatis.github.io/spring/using-api.html mybatis文档警告这种方法 - 特别是它不会参与春季交易。

当我尝试第二种方法时,我们的框架能够参与春季交易。这很奇怪。那么MyBatis文档不正确吗?我通过使用spring transaction + AOP创建各种事务边界来进行广泛验证。 MyBatis DAO每次都能参与Spring管理的事务。由于第二种方法将节省我们90%的开发时间 - 我们真的很喜欢使用它 - 但担心MyBatis警告这种方法。有人试过这种方法吗?非常感谢任何反馈。

1 个答案:

答案 0 :(得分:0)

你有什么回报吗?

我想知道在他们使用的SqlSessionFactory来自Mybatis-api的文档中是否正在讨论org.apache.ibatis.session.SqlSessionFactory来自mybatis-spring lib:org.mybatis.spring.SqlSessionFactoryBean