使用MyBatisPlus+Spring实现声明式事务
在pom.xml中导入依赖
导入MyBatisPlus相关依赖
<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>
配置数据源
server:
port: 8070
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/jdbctest?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
创建实体类
package com.example.plustransactiondemo.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@TableName("acount")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account {
@TableId
private Long id;
private String name;
private Float money;
}
创建Mapper
package com.example.plustransactiondemo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.plustransactiondemo.entity.Account;
public interface AccountMapper extends BaseMapper<Account> {
}
创建Service
AccountService
package com.example.plustransactiondemo.service;
public interface AccountService {
/**
* 转账
*
* @param source 原账户
* @param target 目标账户
* @param money 转账金额
* @return
*/
boolean transfer(String source, String target, float money);
}
AccountServiceImpl
package com.example.plustransactiondemo.service.Impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.plustransactiondemo.entity.Account;
import com.example.plustransactiondemo.mapper.AccountMapper;
import com.example.plustransactiondemo.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AccountServiceImpl implements AccountService {
@Autowired(required = false)
private AccountMapper accountMapper;
//开启事务
@Transactional
@Override
public boolean transfer(String source, String target, float money) {
//第1步:获取汇款方
//--创建条件构造器
QueryWrapper<Account> queryWrapper1 = new QueryWrapper<Account>();
queryWrapper1.eq("name", source);
//执行查询
Account accountSource = accountMapper.selectOne(queryWrapper1);
//第2步:获取收款方
//--创建条件构造器
QueryWrapper<Account> queryWrapper2 = new QueryWrapper<Account>();
queryWrapper2.eq("name", target);
//执行查询
Account accountTarget = accountMapper.selectOne(queryWrapper2);
//第3步:修改汇款方金额
accountSource.setMoney(accountSource.getMoney() - money);
//--调用mybatis-plus的修改方法
int sourceResult = accountMapper.updateById(accountSource);
int i = 1/0;
//第4步:修改收款方金额
accountTarget.setMoney(accountTarget.getMoney() + money);
//--调用mybatis-plus的修改方法
int targetResult = accountMapper.updateById(accountTarget);
if (sourceResult > 0 && targetResult > 0) {
return true;
} else {
return false;
}
}
}
TestController
package com.example.plustransactiondemo.controller;
import com.example.plustransactiondemo.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private AccountService accountService;
@RequestMapping("/test")
public String test(){
boolean isOk = accountService.transfer("A", "B", 200);
if(isOk){
return "转账成功";
}else {
return "转账失败";
}
}
}