转载

Mybatis配置事务管理器

  • 数据库中的事务可以保证在连续执行的 多条写操作(增删改) 时,这多条操作要么成功,要么全部失败,以保证数据和逻辑的完整及严谨
  • 在使用 mybatis 时,无需考虑事务如何创建,如何提交等,只需要配置好事务管理器

配置事务管理器(DataSourceTransactionManager)

  • 在spring的配置文件中配置即可
<!-- 加载db.properties -->
	<util:propertiesid="dbConfig"
		location="classpath:db.properties" />
	
	<!-- 配置数据源 -->
	<beanid="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<propertyname="url"
			value="#{dbConfig.url}" />
		<propertyname="driverClassName"
			value="#{dbConfig.driver}" />
		<propertyname="username"
			value="#{dbConfig.user}" />
		<propertyname="password"
			value="#{dbConfig.password}" />
		<propertyname="initialSize"
			value="#{dbConfig.initSize}" />
		<propertyname="maxActive"
			value="#{dbConfig.maxSize}" />
	</bean>

	<!-- 配置MapperScannerConfigurer,自动扫描整个包,并且spring会自动创建UserMapper接口对象-->
	<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 配置接口文件所在的包 -->
		<propertyname="basePackage"
			value="cn.tedu.spring.mapper" />
	</bean>
	
	<!-- 配置SqlSessionFactoryBean -->
	<beanclass="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 配置数据源:如何连接数据库等 -->
		<propertyname="dataSource"
			ref="dataSource" />
		<!-- 配置XML文件的位置 -->
		<propertyname="mapperLocations"
			value="classpath:mappers/UserMapper.xml" />
	</bean>
	
<!--配置事务管理器,需要用到前面配置的数据源datasource-->
	<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<propertyname="dataSource"ref="dataSource"></property>
	</bean>

开启事务注解

  • 直接在 spring 配置文件中配置即可
<!-- 开启事务注解 ,transaction-manager指定的是上面配置的事务管理器的id-->
<tx:annotation-driventransaction-manager="transactionManager"/>

在需要使用事务的方法上添加 @Transactional 注解(或者是Service类上)

  • 如果添加在类上,那么类中的全部方法都会被事务管理器管理
  • 如果添加在方法上,那么只有这个方法会被管理
  • 事务只发生在 service
  • 在方法上添加注解
@Transactional
public void ChangePasssword(Integer id, String oldPassword,
		String newPassword) throws UserNotFoundException, PasswordNotMatchException{
	User user=this.findUserById(id);  //获取用户信息
	if (user==null) {   //如果用户信息不存在
			throw new UserNotFoundException("操作失败,用户信息不存在");
	}else { //用户存在,则判断原密码
		if (user.getPassword().equals(oldPassword)) {//如果密码匹配
			User user1=new User();
			user1.setPassword(newPassword);
			userMapper.update(user1);
		}else {   //原密码不匹配
				throw new PasswordNotMatchException("操作失败,原密码不正确");
		}
	}
}
  • service 类上添加 @Transactional 注解,那么类中的整个方法都会被管理
@Service  
@Transactional   //配置事务管理
public class UserServiceImplimplements IUserService{
	
	@Resource
	private UserMapper userMapper;
}

开启组件扫描

  • spring-service.xml 中开启组件扫描 service 即可
<!-- 组件扫描 -->
<context:component-scanbase-package="cn.tedu.spring.service"/>

事务如何处理

  • 在spring处理事务时,如果遇到 RuntimeException 就会自动回滚

完整的spring配置文件

<!-- 加载db.properties -->
	<util:propertiesid="dbConfig"
		location="classpath:db.properties" />
	
	<!-- 数据源 -->
	<beanid="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<propertyname="url"
			value="#{dbConfig.url}" />
		<propertyname="driverClassName"
			value="#{dbConfig.driver}" />
		<propertyname="username"
			value="#{dbConfig.user}" />
		<propertyname="password"
			value="#{dbConfig.password}" />
		<propertyname="initialSize"
			value="#{dbConfig.initSize}" />
		<propertyname="maxActive"
			value="#{dbConfig.maxSize}" />
	</bean>

	<!-- 配置MapperScannerConfigurer,自动扫描整个包,并且spring会自动创建UserMapper接口对象-->
	<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 配置接口文件所在的包 -->
		<propertyname="basePackage"
			value="cn.tedu.spring.mapper" />
	</bean>
	
	<!-- 配置SqlSessionFactoryBean -->
	<beanclass="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 配置数据源:如何连接数据库等 -->
		<propertyname="dataSource"
			ref="dataSource" />
		<!-- 配置XML文件的位置,其中的值是一个数组 -->
		<propertyname="mapperLocations">
				<array>
					<value>classpath:mappers/UserMapper.xml</value>
					<value>classpath:mappers/DormitoryMapper.xml</value>
				</array>
			</property>
	</bean>
	
	<!-- 配置事务管理器 -->
	<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<!-- 配置数据源 -->
		<propertyname="dataSource"ref="dataSource"></property>
	</bean>
	
	<!-- 开启事务注解 ,transaction-manager指定的是上面配置的事务管理器的id-->
	<tx:annotation-driventransaction-manager="transactionManager"/>
原文  https://chenjiabing666.github.io/2018/05/04/Mybatis配置事务管理器/
正文到此结束
Loading...