mybatis与spring整合事务管理

11 篇文章 0 订阅
9 篇文章 0 订阅

1.最重要的spring配置文件

<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:jdbc.properties" />
	</bean>
	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>${driverClassName}</value>
		</property>
		<property name="password">
			<value>${password}</value>
		</property>
		<property name="username">
			<value>${username}</value>
		</property>
		<property name="url">
			<value>${url}</value>
		</property>
	</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:mybatis.xml" />
		<property name="plugins">
			<array>
				<ref bean="pagePlugin" />
			</array>
		</property>
		<property name="mapperLocations">
			<list>
<!-- 事务配置 -->
	<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<aop:config>
		<aop:pointcut
			expression="execution(public * com.test.service.*.*(..))"
			id="pointcutExtend" />
		<aop:pointcut
			expression="execution(public * com.test.frame.service.impl.*.*(..))"
			id="pointcutBase" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutExtend" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutBase" />
	</aop:config>
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="query*" propagation="REQUIRED" read-only="true" />
			<tx:method name="expand*" propagation="REQUIRED" read-only="true" />
			<tx:method name="save*" propagation="REQUIRED"  rollback-for="Exception"/>
			<tx:method name="insert*" propagation="REQUIRED"  rollback-for="Exception" />
			<tx:method name="delete*" propagation="REQUIRED"  rollback-for="Exception"/>
			<tx:method name="update*" propagation="REQUIRED"  rollback-for="Exception"/>
		</tx:attributes>
	</tx:advice>
service中方法:

public String insertEntity(BaseEntity entity) throws Exception {
		if (null == entity.getId() || "".equalsIgnoreCase(entity.getId())) {
			entity.setId(CreateUuid.getID());
		}
		this.dao.insertEntity(entity);
		int i=1/0;//测试spring事务
		return entity.getId();
	}

注意事项:

//1.直接<aop:pointcut
/*expression="execution(public * com.test.service.*.*(..))"
id="pointcut" />
达不到事务的目的,必须
<aop:pointcut
expression="execution(public * com.ssm.core.frame.service.impl.*.*(..))"
id="pointcut1" />
才可以,如果在子类ProviderServiceImpl中的方法可以使用上面第一句话来进行事务控制。一遍情况下子类为空,用的都是继承的BaseService中方法,只切面子类ProviderServiceImpl是不行的。
*/


测试代码:

Provider provider4 = new Provider();
		//ProviderID,BH,MC,LXR,DH,DZ,YX,CZ,BZ1,BZ2
		//provider4.setId(CreateUuid.getID());
		provider4.setBh("bh4");
		provider4.setMc("mc4");
		provider4.setLxr("lxr4");
		provider4.setDh("dh4");
		provider4.setDz("dz4");
		provider4.setYx("yx4");
		provider4.setCz("cz4");
		provider4.setBz1("bz1");
		provider4.setBz2("bz2");
		String insertResult4 = providerService.insertEntity(provider4);

正确输出日志为:

DEBUG 2016-03-03 21:11:47,004 org.mybatis.spring.SqlSessionUtils.main Creating a new SqlSession
DEBUG 2016-03-03 21:11:47,009 org.mybatis.spring.SqlSessionUtils.main Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]
DEBUG 2016-03-03 21:11:47,047 org.mybatis.spring.transaction.SpringManagedTransaction.main JDBC Connection [org.sqlite.Conn@112da40] will be managed by Spring
DEBUG 2016-03-03 21:11:47,048 com.qinghu.knifemanagement.domain.Provider.insert.main ooo Using Connection [org.sqlite.Conn@112da40]
DEBUG 2016-03-03 21:11:47,053 com.qinghu.knifemanagement.domain.Provider.insert.main ==>  Preparing: INSERT INTO T_Provider (ProviderID,BH,MC,LXR,DH,DZ,YX,CZ,BZ1,BZ2) VALUES (?,?,?,?,?,?,?,?,?,?) 
DEBUG 2016-03-03 21:11:47,073 com.qinghu.knifemanagement.domain.Provider.insert.main ==> Parameters: 832dd0a5747345dabdaeef72c184966e(String), bh4(String), mc4(String), lxr4(String), dh4(String), dz4(String), yx4(String), cz4(String), bz1(String), bz2(String)
DEBUG 2016-03-03 21:11:47,074 org.mybatis.spring.SqlSessionUtils.main Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]
DEBUG 2016-03-03 21:11:47,074 org.springframework.jdbc.datasource.DataSourceTransactionManager.main Initiating transaction rollback
DEBUG 2016-03-03 21:11:47,074 org.springframework.jdbc.datasource.DataSourceTransactionManager.main Rolling back JDBC transaction on Connection [org.sqlite.Conn@112da40]
DEBUG 2016-03-03 21:11:47,075 org.mybatis.spring.SqlSessionUtils.main Transaction synchronization rolling back SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]
DEBUG 2016-03-03 21:11:47,075 org.mybatis.spring.SqlSessionUtils.main Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@afae4a]
DEBUG 2016-03-03 21:11:47,075 org.springframework.jdbc.datasource.DataSourceTransactionManager.main Releasing JDBC Connection [org.sqlite.Conn@112da40] after transaction
DEBUG 2016-03-03 21:11:47,075 org.springframework.jdbc.datasource.DataSourceUtils.main Returning JDBC Connection to DataSource
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.ssm.core.frame.service.impl.BaseService.insertEntity(BaseService.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy8.insertEntity(Unknown Source)



注意日志中的有关事务的描述。

假如事务没起作用,比如pointcut指向的类不对,那么日志信息为:

DEBUG 2016-03-03 21:13:57,732 org.mybatis.spring.SqlSessionUtils.main Creating a new SqlSession
DEBUG 2016-03-03 21:13:57,738 org.mybatis.spring.SqlSessionUtils.main SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1570945] was not registered for synchronization because synchronization is not active
DEBUG 2016-03-03 21:13:57,776 org.springframework.jdbc.datasource.DataSourceUtils.main Fetching JDBC Connection from DataSource
DEBUG 2016-03-03 21:13:57,776 org.springframework.jdbc.datasource.DriverManagerDataSource.main Creating new JDBC DriverManager Connection to [jdbc:sqlite:data/ikakeibo.dat]
DEBUG 2016-03-03 21:13:57,777 org.mybatis.spring.transaction.SpringManagedTransaction.main JDBC Connection [org.sqlite.Conn@ecb67f] will not be managed by Spring
DEBUG 2016-03-03 21:13:57,778 com.qinghu.knifemanagement.domain.Provider.insert.main ooo Using Connection [org.sqlite.Conn@ecb67f]
DEBUG 2016-03-03 21:13:57,783 com.qinghu.knifemanagement.domain.Provider.insert.main ==>  Preparing: INSERT INTO T_Provider (ProviderID,BH,MC,LXR,DH,DZ,YX,CZ,BZ1,BZ2) VALUES (?,?,?,?,?,?,?,?,?,?) 
DEBUG 2016-03-03 21:13:57,802 com.qinghu.knifemanagement.domain.Provider.insert.main ==> Parameters: dcb3fe804163407fa3f45d0337595d2f(String), bh4(String), mc4(String), lxr4(String), dh4(String), dz4(String), yx4(String), cz4(String), bz1(String), bz2(String)
DEBUG 2016-03-03 21:13:57,911 org.mybatis.spring.SqlSessionUtils.main Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1570945]
DEBUG 2016-03-03 21:13:57,912 org.springframework.jdbc.datasource.DataSourceUtils.main Returning JDBC Connection to DataSource
Exception in thread "main" java.lang.ArithmeticException: / by zero

注意日志信息中的Closing non transactional SqlSession ,表明这个是没有事务控制的,因此可以成功插入记录,而没有进行回滚。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值