SpringBoot整合Mybatis,并实现事务控制

1、 在pom文件里添加相关maven文件

SpringBoot整合Mybatis,并实现事务控制-LMLPHP
    <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- Junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
SpringBoot整合Mybatis,并实现事务控制-LMLPHP

2、 在application.properties配置文件中引入数据源,创建数据库表,并插入两条原始数据:andy 余额200元,lucy 余额300元

1 spring.datasource.url=jdbc:mysql://localhost:3306/springboot_demo
2 spring.datasource.username=root
3 spring.datasource.password=root
4 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
SpringBoot整合Mybatis,并实现事务控制-LMLPHP
DROP TABLE IF EXISTS tbl_account;
CREATE TABLE tbl_account (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) NOT NULL,
balance float,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; insert into tbl_account(id,name,balance) values(1, 'andy','200');
insert into tbl_account(id,name,balance) values(2, 'lucy','300');
SpringBoot整合Mybatis,并实现事务控制-LMLPHP

数据库初始值如下:

SpringBoot整合Mybatis,并实现事务控制-LMLPHP

3、 开发实体类,dao,service,controller,mapper等
实体类 :

SpringBoot整合Mybatis,并实现事务控制-LMLPHP
public class Account {

    private int id;
private String name;
private float balance; public Account() { }
// 省略setter / getter
}
SpringBoot整合Mybatis,并实现事务控制-LMLPHP

dao :

SpringBoot整合Mybatis,并实现事务控制-LMLPHP
public interface AccountDao {

    public void moveIn(@Param("id") int id, @Param("money") float money); // 转入

    public void moveOut(@Param("id") int id, @Param("money") float money); // 转出
}
SpringBoot整合Mybatis,并实现事务控制-LMLPHP

service :

1 public interface AccountService {
2 //转账
3 public void transfer(int outter,int inner,Integer money);
4
5 }

service 实现类:

SpringBoot整合Mybatis,并实现事务控制-LMLPHP
 1 @Service
2 public class AccountServiceImpl implements AccountService{
3
4 @Autowired
5 private AccountDao accountDao;
6
7 public void transfer(int outter, int inner, Integer money) {
8
9 accountDao.moveOut(outter, money); //转出
10 accountDao.moveIn(inner, money); //转入
11
12 }
13 }
SpringBoot整合Mybatis,并实现事务控制-LMLPHP

controller:

SpringBoot整合Mybatis,并实现事务控制-LMLPHP
 1 @RestController
2 @RequestMapping(value = "/account")
3 public class AccountController {
4
5 @Autowired
6 private AccountService accountService;
7
8
9 @RequestMapping("/transfer")
10 public String test(){
11 try {
12 // andy 给lucy转账50元
13 accountService.transfer(1, 2, 50);
14 return "转账成功";
15 } catch (Exception e) {
16 e.printStackTrace();
17 return "转账失败";
18 }
19 }
20 }
SpringBoot整合Mybatis,并实现事务控制-LMLPHP

mapper:

SpringBoot整合Mybatis,并实现事务控制-LMLPHP
<?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="cn.yideng.tx.dao.AccountDao"> <!-- 转入 -->
<update id="moveIn" >
update tbl_account
set balance = balance + #{money }
where id= #{id,jdbcType=INTEGER}
</update> <!-- 转出 -->
<update id="moveOut" >
update tbl_account
set balance = balance - #{money }
where id= #{id,jdbcType=INTEGER}
</update> </mapper>
SpringBoot整合Mybatis,并实现事务控制-LMLPHP
 

4、 在application.properties配置文件中添加对mapper文件的扫描

1 mybatis.typeAliasesPackage: cn.yideng.*.entity
2 mybatis.mapperLocations: classpath:mapper/*.xml

5、 在启动类中添加对mapper包扫描@MapperScan

SpringBoot整合Mybatis,并实现事务控制-LMLPHP
1 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
2 @EnableAutoConfiguration
3 @MapperScan("cn.yideng.*.dao")
4 public class DemoApplication {
5
6 public static void main(String[] args) {
7 SpringApplication.run(DemoApplication.class, args);
8 }
9 }
SpringBoot整合Mybatis,并实现事务控制-LMLPHP
 

6、 浏览器测试 http://localhost:8080/account/transfer , 测试显示 转账成功,看看数据库的数据,andy余额是150, lucy余额350,都是对的,如下图所示。

SpringBoot整合Mybatis,并实现事务控制-LMLPHP

7,接着我们修改service,在实现类里,转出之后抛个异常,代码如下

SpringBoot整合Mybatis,并实现事务控制-LMLPHP
 1 @Service
2 public class AccountServiceImpl implements AccountService{
3
4 @Autowired
5 private AccountDao accountDao;
6
7 public void transfer(int outter, int inner, Integer money) {
8
9 accountDao.moveOut(outter, money); //转出
10 int i = 1/0; // 抛出异常
11 accountDao.moveIn(inner, money); //转入
12
13 }
14 }
SpringBoot整合Mybatis,并实现事务控制-LMLPHP
 

8,把数据库的数据恢复成最初的 andy-200, lucy-300, 然后启动类测试,浏览器输入http://localhost:8080/account/transfer , 测试显示 转账失败,看看数据库的数据,andy余额是150, lucy余额300,如下图所示。

SpringBoot整合Mybatis,并实现事务控制-LMLPHP
相当于转出成功,转入没有成功,这是不对的,应该都成功,或者都不成功。

9, 我们接着在service实现类上添加@Transactional 注解,声明一个事务,如下

SpringBoot整合Mybatis,并实现事务控制-LMLPHP
 1 @Service
2 public class AccountServiceImpl implements AccountService{
3
4 @Autowired
5 private AccountDao accountDao;
6
7 @Transactional
8 public void transfer(int outter, int inner, Integer money) {
9
10 accountDao.moveOut(outter, money); //转出
11 int i = 1/0; // 抛出异常
12 accountDao.moveIn(inner, money); //转入
13
14 }
15 }
SpringBoot整合Mybatis,并实现事务控制-LMLPHP

10,再把数据库的数据恢复成最初的 andy-200, lucy-300, 然后启动类测试,浏览器输入http://localhost:8080/account/transfer , 测试显示 转账失败,看看数据库的数据,andy余额是200, lucy余额300,如下图所示。

SpringBoot整合Mybatis,并实现事务控制-LMLPHP

说明转出和转入都没有成功,这才是合乎逻辑的。

springboot 开启事物很简单,只需要加注解@Transactional 和 @EnableAutoConfiguration,声明事务就可以了,

05-11 17:54