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

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

复制代码

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.3.RELEASE
         
    

    
        
            org.springframework.boot
            spring-boot-starter
        

        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-jdbc
        

        
            mysql
            mysql-connector-java
            5.1.21
        

        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            1.3.2
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
        
            junit
            junit
            test
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

复制代码

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

复制代码

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,并实现事务控制_第1张图片

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

复制代码

public class Account {

    private int id; 
    private String name;
    private float balance;

    public Account() {

    }
    // 省略setter / getter
}

复制代码

dao :

复制代码

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); // 转出
}

复制代码

service :

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

service 实现类:

复制代码

 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 }

复制代码

controller:

复制代码

 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 }

复制代码

mapper:

复制代码






    
    
        update tbl_account 
        set balance = balance + #{money }
        where id= #{id,jdbcType=INTEGER}
    

    
    
        update tbl_account 
        set balance = balance - #{money }
        where id= #{id,jdbcType=INTEGER}
    

复制代码

 

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

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

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

复制代码

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 }

复制代码

 

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

SpringBoot整合Mybatis,并实现事务控制_第2张图片

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

复制代码

 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 }

复制代码

 

 

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

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

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

复制代码

 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 }

复制代码

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

SpringBoot整合Mybatis,并实现事务控制_第4张图片

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

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

你可能感兴趣的:(springBoot,JAVA事务)