mybatis集成spring事务

     在mybatis中使用spring的事务可以分为以下几步:

1、配置datasource

 <!-- 数据库的配置文件 -->
    <context:property-placeholder location="classpath*:com/business/coifg/sq-databaseConfig-db2.properties"/>
<!--
加载数据源 使用了 c3p0 数据连接池--> <bean id="sq-dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driverClassName}" /> <property name="jdbcUrl" value="${jdbc.url}" /> <property name="user" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!--连接关闭时默认将所有未提交的操作回滚。Default: false --> <property name="autoCommitOnClose" value="${cpool.autoCommitOnClose}"/> <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --> <property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/> <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize" value="${cpool.minPoolSize}"/> <!--连接池中保留的最小连接数 --> <property name="minPoolSize" value="${cpool.minPoolSize}"/> <!--连接池中保留的最大连接数。 --> <property name="maxPoolSize" value="${cpool.maxPoolSize}"/> <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime" value="${cpool.maxIdleTime}"/> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement" value="${cpool.acquireIncrement}"/> <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod" value="${cpool.idleConnectionTestPeriod}"/> <property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/> <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么 属性preferredTestQuery将被忽略。 你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。Default: null--> <property name="automaticTestTable" value="${cpool.automaticTestTable}"/> <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意: 测试的表必须在初始数据源的时候就存在。Default: null--> <property name="preferredTestQuery" value="${cpool.preferredTestQuery}"/> <!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false --> <property name="testConnectionOnCheckin" value="${cpool.testConnectionOnCheckin}" /> </bean>

上面的value值取自properties配置文件,可以根据个人情况自行配置

2、配置transactionManager

<!-- Spring 事务管理 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="sq-dataSource"/>
    </bean>

3、配置事务处理拦截器

<bean id="transactionInterceptor"
        class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager" />
        <!-- 配置事务属性 -->
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED,-AppException,-Exception</prop>
                <prop key="fetch*">PROPAGATION_REQUIRED,readOnly</prop>
            </props>
        </property>
    </bean>

上面的-AppException和-Exception表明,在事务所在的service实现里,触发以这两个结尾的异常时回滚。其中AppException为自定义异常。而已-Exception结尾则说明,遇到任何异常都会回滚,这种配置并不妥当,理论上在遇到不影响数据库的逻辑的异常时不需要回滚。具体根据情况设置。

4、自动创建事务代理

<!-- 自动创建事务代理 -->
    <bean
        class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <list>
                <value>*Service</value>
            </list>
        </property>
        <property name="interceptorNames">
            <list>
                <value>transactionInterceptor</value>
            </list>
        </property>
    </bean>

*service:指spring会寻找所有已Serivce结尾的注解。例如:@Service("testService")将会被spring自动创建transaction代理

5、编写service层和service实现层

public interface TestService{

public void insert();

}

@Service("testService")
public class TestServiceImpl implements TestService{

@Transactional
public void insert(){
}

}

一切OK。

 

 

 

 

posted @ 2013-04-26 15:37  我爱班花  阅读(514)  评论(0编辑  收藏  举报