事务实现转帐:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>mybatis-transaction-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis-transaction-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <optional>true</optional>
</dependency>
<!-- mysql-connector -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<!-- 文件上传:Begin -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 文件上传:End -->
<!--用于接受多媒体文件-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.3</version>
</dependency>
<!--跨服务器上传:Begin -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19</version>
</dependency>
<!--跨服务器上传:End -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 8070
spring:
# 配置数据源信息
datasource:
# 配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
# 配置连接数据库信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/jdbc_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username: root
password: 123456789
mybatis-plus:
type-aliases-package: demo.entity
configuration:
# 配置MyBatis日志,执行sql的时候,将sql打印到控制台
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
table-prefix: t_
id-type: auto
mapper-locations: classpath:mappers/*.xml
servlet:
multipart:
#设置单个文件大小,-1表示不限制,单位MB
max-file-size: 10MB
#设置单次请求的文件的总大小,-1表示不限制,单位MB
max-request-size: 100MB
Demo.java(启动类)
package demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("demo.mapper")
public class Demo {
public static void main(String[] args) {
SpringApplication.run(Demo.class);
}
}
Account.java
package demo.entity;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class Account {
private Integer id;
private String name;
private BigDecimal money;
}
AccountMapper.java
package demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import demo.entity.Account;
import org.springframework.stereotype.Repository;
@Repository
public interface AccountMapper extends BaseMapper<Account> {
}
AccountServiceImpl
package demo.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import demo.entity.Account;
import demo.mapper.AccountMapper;
import demo.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountMapper accountMapper;
//开启事务
@Transactional
@Override
public boolean transfer(String source, String target, BigDecimal money) {
boolean isOK= false;
//获取汇款方,源账户
QueryWrapper<Account> wrapper1=new QueryWrapper<Account>();
wrapper1.eq("name",source);
Account sourcePerson=accountMapper.selectOne(wrapper1);
//获取收款方,目标账户
QueryWrapper<Account> wrapper2=new QueryWrapper<Account>();
wrapper2.eq("name",target);
Account targetPerson=accountMapper.selectOne(wrapper2);
//转账
//原账户取出700
sourcePerson.setMoney(sourcePerson.getMoney().subtract(money));//十进制的减法
int a=accountMapper.updateById(sourcePerson);
//模拟异常
int x=10/0;
//目标账户存入700
targetPerson.setMoney(targetPerson.getMoney().add(money));//进行十进制加法
int b=accountMapper.updateById(targetPerson);
if(a>0&&b>0){
isOK=true;
}
return isOK;
}
}
AccountService.java
package demo.service;
import java.math.BigDecimal;
public interface AccountService {
/**
* 转账
* @param source 原账户
* @param target 目标账户
* @param money 转账金额
* @return
*/
boolean transfer(String source, String target, BigDecimal money);
}
AccountController.java
package demo.controller;
import demo.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
@RestController
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping("/test")
public String transfer(){
boolean b=accountService.transfer("A","B", BigDecimal.valueOf(700));
return b ?"成功":"失败";
}
}
数据库