0
点赞
收藏
分享

微信扫一扫

springboot+mybatis-plus模拟转账案例(声明式事务)

归零者245号 2022-03-11 阅读 60

一、导入依赖

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

二、配置数据源

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/jdbctest?useSSL=true&useUnicode=true&characterEncoding=utf-8
    username: root
    password: root

三、pojo

package com.zhmsky.spring10_transaction.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * @author zhmsky
 * @date 2022/3/7 16:56
 */
@TableName("acount")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account implements Serializable {
    @TableId(type = IdType.AUTO)
    private Integer id;

    private String name;

    private BigDecimal money;
}

四、mapper

package com.zhmsky.spring10_transaction.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zhmsky.spring10_transaction.pojo.Account;
import org.apache.ibatis.annotations.Mapper;

/**
 * @author zhmsky
 * @date 2022/3/7 17:00
 */
@Mapper
public interface AccountMapper extends BaseMapper<Account> {
}

五、service

package com.zhmsky.spring10_transaction.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zhmsky.spring10_transaction.pojo.Account;

import java.math.BigDecimal;

/**
 * @author zhmsky
 * @date 2022/3/7 16:59
 */
public interface AccountService extends IService<Account> {

    boolean transfer(String source, String target, BigDecimal money);
}

六、impl

package com.zhmsky.spring10_transaction.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhmsky.spring10_transaction.mapper.AccountMapper;
import com.zhmsky.spring10_transaction.pojo.Account;
import com.zhmsky.spring10_transaction.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;

/**
 * @author zhmsky
 * @date 2022/3/7 17:01
 */
@Service
public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> implements AccountService {
    @Autowired
    private AccountMapper accountMapper;

    private Integer i1;
    private Integer i2;

    //开启事务
    @Transactional
    @Override
    public boolean transfer(String source, String target, BigDecimal money) {
        //获取汇款方
        QueryWrapper<Account> wrapper1 = new QueryWrapper<>();
        wrapper1.eq("name", source);
        Account one1 = accountMapper.selectOne(wrapper1);

        QueryWrapper<Account> wrapper2 = new QueryWrapper<>();
        wrapper2.eq("name", target);
        Account one2 = accountMapper.selectOne(wrapper2);

        one1.setMoney(one1.getMoney().subtract(money));
        i1 = accountMapper.updateById(one1);
        //模拟转账异常
        int a=1/0;

        one2.setMoney(one2.getMoney().add(money));
        i2 = accountMapper.updateById(one2);
        if (i1 > 0 && i2 > 0) {
            return true;
        }
        return false;
    }
}

七、测试

package com.zhmsky.spring10_transaction;

import com.zhmsky.spring10_transaction.service.AccountService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.math.BigDecimal;

@SpringBootTest
class Spring10TransactionApplicationTests {

    @Autowired
    private AccountService accountService;

    @Test
    void contextLoads() {
        boolean b = accountService.transfer("A", "B", BigDecimal.valueOf(700D));
        if(b){
            System.out.println("转账成功!");
        }else {
            System.out.println("转账异常!");
        }
    }

}

举报

相关推荐

0 条评论