测试事务--测试项目中配置的事务讲解

前言:

在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

其实,关于事务管理的更多了解,希望小伙伴们去自己查阅资料。在开发项目的过程中事务管理是一个很重要的模块。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值