spring事务回滚配置文件方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yjz_sdau/article/details/79945431

目录结构一览:


需要导入的jar包(红色框处的地方是添加事务专门加上的)


新添加配置文件中的约束:


其他文件都跟之前的一样,所以专门说一下配置文件跟如何事务处理的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:p="http://www.springframework.org/schema/p" 
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
        
        <!-- 注解扫描 -->
        <context:component-scan base-package="com.hpe"></context:component-scan>
        
       	<!-- 加载db.properties配置文件,location指定位置 -->
       	<context:property-placeholder location="classpath:db.properties"/>
        
        <!-- 配置c3p0数据源 ,配置c3p0数据源的bean-->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        	<!-- 注入连接数据库的属性 -->
        	<property name="driverClass" value="${jdbc.driver}"></property>
        	<property name="jdbcUrl" value="${jdbc.url}"></property>
        	<property name="user" value="${jdbc.user}"></property>
        	<property name="password" value="${jdbc.password}"></property>
        </bean>
        
        <!-- 通过spring管理SqlSessionFactory、mapper接口 -->
        
        <!-- 配置sqlSessionFactory的bean -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        	<!-- 配置mybatis核心配置文件的路径 -->
        	<property name="configLocation" value="classpath:SqlMapConfig.xml"></property>
        	<!-- 指定数据源 -->
        	<property name="dataSource" ref="dataSource"></property>
        	<!-- 指定批量创建别名的包 -->
        	<property name="typeAliasesPackage" value="com.hpe.po"></property>
        </bean>
        
        
        <!-- 如何批量创建mapper接口实现类的bean?,bean的id是什么呢 (接口名称,首字母小写)-->
       
       <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
       		
       		<!-- basePackage:指明,创建哪个包下的Mapper接口实现类的bean -->
       		<property name="basePackage" value="com.hpe.mapper"></property>
       		<!-- 指定sqlSessionFactory -->	
       		<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
       			
       </bean>
       
       <!-- spring的声明式事务:xml方式 -->
       
       <!-- 1.配置事务管理器 (不仅xml方式得写,注解方式也得写):配置事务管理器的bean-->
       <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
       		<!-- 数据源 -->
       		<property name="dataSource" ref="dataSource"></property>
       </bean>
       
       <!-- 2.配置事务增强 -->
       <tx:advice id="txAdvice" transaction-manager="transactionManager">
       		<!-- 配置事务属性 
       		propagation:事务的传播行为
       		-->
       		<tx:attributes>
       			<!-- 给那些方法设置什么样的信息 -->
       			<tx:method name="insert*" propagation="REQUIRED" />
       			<tx:method name="delete*" propagation="REQUIRED"/>
       			<tx:method name="update*" propagation="REQUIRED"/>
       			<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
       		</tx:attributes>
       </tx:advice>
       
       <!-- 3.配置aop事务 -->
       <aop:config>
       		<!-- 配置切入点 -->
       		<aop:pointcut expression="execution(* com.hpe.service.*.*(..))" id="pointcut1"/>
       		<!-- 应用增强 -->
       		<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
       </aop:config>
</beans>

在UserServiceImpl中,deleteById方法,我们设置个异常,system.out.println(1/0),该语句会出现异常,当我们不提供事务时候,就没有回滚功能,出现异常之前对数据库的操作,会终止,出现异常之后的语句,不会执行,这是我们不想看到的。我们希望出现异常后,一切对数据库的操作都会还原。

package com.hpe.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hpe.mapper.UserMapper;
import com.hpe.po.User;
import com.hpe.service.IUserService;

@Service
public class UserServiceImpl implements IUserService {
	
	@Autowired
	private UserMapper userMapper;
	
	
	@Override
	public User selectUserById(int id) {
		
		return userMapper.selectUserById(id);
		
	}

	public int deleteUserById(int id) {
		userMapper.deleteUserById(id);
		System.out.println(1/0);
		userMapper.deleteUserById(id+1);
		return 0;
	}

}

我们可以用junit测试,不加事务处理,userMapper.deleteUserById(id);会在数据库生效,但是加上事务,虽然执行了,但是回滚以后,数据库不会有变化,即删除功能失效。

package com.hpe.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.hpe.po.User;
import com.hpe.service.IUserService;

public class SpringMyBatisTest {
	
	@Test
	public void test()
	{
		
		ApplicationContext context= new ClassPathXmlApplicationContext("applicationContext.xml");
		
		IUserService userService = context.getBean(IUserService.class);
		
		User user = userService.selectUserById(7);
		
		System.out.println(user);
	}
	
	@Test
	public void test1()
	{
		
		ApplicationContext context= new ClassPathXmlApplicationContext("applicationContext.xml");
		
		IUserService userService = context.getBean(IUserService.class);
		
		int res = userService.deleteUserById(6);
		
		System.out.println(res);
		
	}

}


阅读更多

没有更多推荐了,返回首页