如何在Mybatis项目中实现事务管理



我目前正在进行一个已经实现mybatis的项目。由于这是一个遗留代码,因此使用实现

  1. 弹簧
  2. Mybatis
  3. JAxrs

Spring应用程序上下文文件

    <bean id="sqlSessionFactory"         class="com.ca.aa.ui.framework.common.mybatis.SqlSessionFactoryBeanWrapper">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath*:ibatis/*_mapper.xml" />
</bean>

应用程序上下文中引用了另一个xml文件

<bean class="org.mybatis.spring.mapper.MapperFactoryBean" name="tenantDAO">
    <property name="mapperInterface"   value="com.ca.ias.data.dao.TenantDAO"  />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

TenantDAO.java

public interface TenantDAO {
public List<something> somemethod1();
}

然后有一个服务层访问上面的java类,然后持久化对象

<bean id="issuerService" class="com.ca.ias.admin.service.IssuerServiceImpl">
    <property name="tenantDAO" ref="tenantDAO"/>
</bean>

有一个简单的java方法,它调用tenantDAO,然后持久化对象。

IssuerServiceImpl.java

public void insert(){
try{
   tenantDao.insert();
}catch(Exception e){
}finally{
}

我如何在这里实现事务管理器,请帮忙?

有很多方法可以做到这一点,特别是在您已经配置了spring的情况下。基本上你需要配置两件事

  1. 交易管理器
  2. 事务边界

交易管理器

您需要在spring上下文中定义事务管理器。根据sqlSessionFactory定义中提到的dataSource的来源,它可能会有所不同。很可能你在项目中使用了连接池,也就是说你有一些连接池的配置,比如:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close">
   <property name="driverClassName" value="${jdbc.driverClassName}" />
   <property name="url" value="${jdbc.url}" />
   <property name="username" value="${jdbc.username}" />
   <property name="password" value="${jdbc.password}" />
</bean> 

如果是这种情况,那么您需要将这样的配置添加到spring上下文中

<bean id="txManager" 
     class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource"/>
</bean>

交易边界

最简单的方法是使用注释驱动的事务划分。

然后你需要先启用它:

<tx:annotation-driven transaction-manager="txManager"/>

使用此配置,您可以使用Transactional注释来标记服务中的方法:

@Transactional
public void insert(){
}
@Transactional(readOnly=true)
public void find(){
}

最新更新