前言:
在MyBatis+Spring的整合项目中,事务是由Spring 来管理的。在上篇博客中我们已经配置了事务管理器,并开启了事务注解,接下来,我们做一个实验来确定事务的配置是否正确,以及事务管理能否生效。
在项目中,一般把数据库事务管理放在业务层(Service层)。所以业务层既是处理业务的地方,又是管理数据库事务的地方。要对事务进行测试,首先需要创建业务层,并在业务层编写添加客户操作的代码;然后在添加操作的代码后,有意地添加一段异常代码(如inti=1/0;)来模拟现实中的意外情况;最后编写测试方法,调用业务层的添加方法。
这样,程序在执行到错误代码时就会出现异常在没有事务管理的情况下,即使出现了异常,数据也会被存储到数据表中;如果添加了事务管理,并且事务管理的配置正确,那么在执行上述操作时,所添加的数据将不能够插入到数据表中。
测试事务
1、在CustomerMapper 接口中,增加接口方法addCustomer()
package com.zsj.mapper;
import com.zsj.po.Customer;
public interface CustomerMapper {
// 添加客户
public void addCustomer(Customer customer);
}
2、在映射文件CustomerMapper.xml 中编写添加客户信息的SQL statement
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsj.mapper.CustomerMapper">
<!--添加客户信息 -->
<insert id="addCustomer" parameterType="customer">
insert into t_customer(username,jobs,phone)
values(#{username},#{jobs},#{phone})
</insert>
</mapper>
3、在src 目录下创建com.zsj.service 包,并在包中创建接口CustomerService,在接口中编写一个添加客户的方法addCustomer()
package com.zsj.service;
import com.zsj.po.Customer;
public interface CustomerService {
public void addCustomer(Customer customer);
}
4、在src 目录下创建一个com.zsj.service.impl 包,包中创建CustomerService接口的实现类CustomerServicelmpl
package com.zsj.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.zsj.mapper.CustomerMapper;
import com.zsj.po.Customer;
import com.zsj.service.CustomerService;
/**
* @Service注解将CustomerServicelmpl标识为业务层的组件,
* @Transactional注解将CustomerServicelmpl 标识为事务处理的类
* @Autowired注解表示自动装配,即自动将CustomerMapper 接口注入到本类中
*
*注意:先将@Transactional注解进行了注释,是为了先执行此类没有事务管理的情况,
*之后再删除注释,执行包含事务管理的情况,即可通过结果来验证事务是否配置成功。
*/
@Service
@Transactional
public class CustomerServiceImpl implements CustomerService {
//注解注入CustomerMapper
@Autowired
private CustomerMapper customerMapper;
//添加客户
public void addCustomer(Customer customer) {
this.customerMapper.addCustomer(customer);
int i=1/0; //模拟添加操作后系统突然出现的异常问题
}
}
5、在Spring 的配置文件中,编写开启组件扫描的配置代码
<!-- 开启扫描 -->
<context:component-scan base-package="com.zsj.service" />
6、在test包中编写测试类TransactionTest
package test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.zsj.mapper.CustomerMapper;
import com.zsj.po.Customer;
import com.zsj.service.CustomerService;
/**
* 测试事务
*/
public class TransactionTest {
public static void main(String[] args) {
ApplicationContext act =
new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerService customerService = act.getBean(CustomerService.class);
Customer customer = new Customer();
customer.setUsername("zhangteng");
customer.setJobs("Colleage doctor");
customer.setPhone("1888297623265");
customerService.addCustomer(customer);
}
}
7、运行测试类TransactionTest
在运行测试之前,先来查看下数据库中的已有数据,一共有6条记录。
运行结果:
虽然控制台也会显示抛出的异常信息,但是此时t_ customer表中依旧保持6条数据,这也就说明项目中的事务配置起作用了。
注意:
如果我们把CustomerServicelmpl的注解@Transactional给注释掉了。可以看到,程序已经执行了插入操作,并且在执行到错误代码时抛出了异常信息,再次查询t_ customer表,其表中的数据表明新添加的记录已经存储到了t__customer表中。这说明项目中的事务管理没有起作用,这是正确的,
而我们上面的截图是将@Transactional前面的注释删除后再次运行测试类TransactionTest
其实,关于事务管理的更多了解,希望小伙伴们去自己查阅资料。在开发项目的过程中事务管理是一个很重要的模块。