zoukankan      html  css  js  c++  java
  • SpringBoot整合Mybatis,并实现事务控制

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

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

    复制代码
        <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>
    复制代码

    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');
    复制代码

    数据库初始值如下:

    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:

    复制代码
    <?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>
    复制代码
     

    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,都是对的,如下图所示。

    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,如下图所示。


    相当于转出成功,转入没有成功,这是不对的,应该都成功,或者都不成功。

    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 开启事物很简单,只需要加注解@Transactional 和 @EnableAutoConfiguration,声明事务就可以了,

  • 相关阅读:
    hihoCoder #1176 : 欧拉路·一 (简单)
    228 Summary Ranges 汇总区间
    227 Basic Calculator II 基本计算器II
    226 Invert Binary Tree 翻转二叉树
    225 Implement Stack using Queues 队列实现栈
    224 Basic Calculator 基本计算器
    223 Rectangle Area 矩形面积
    222 Count Complete Tree Nodes 完全二叉树的节点个数
    221 Maximal Square 最大正方形
    220 Contains Duplicate III 存在重复 III
  • 原文地址:https://www.cnblogs.com/telwanggs/p/10875538.html
Copyright © 2011-2022 走看看