在往期的银行管理系统中,我们是用JDBC实现功能的实现,同时包括转账功能,也是运用事务
通过上述图片可以看到事务需要这么冗长的代码量,而且容易码写错误,现在我们可以通过MyBatisPlus+Spring注解实现事务
导入库
功能实现
结构图
导入porm依赖
这里我们导入的依赖是mybatis-plus,mysql,lombok
<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>
application.yml文件
server:
port: 8070
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jdbctest?useSSL=false&useUnicode=true&characterEncoding=utf-8
username: root
password: 123456
测试类
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,args);
}
}
实体类
package demo.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 demo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import demo.entity.Account;
public interface AccountMapper extends BaseMapper<Account> {
}
service层
接口
实现类
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;
@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<>();
queryWrapper1.eq("name", source);
Account accountSource = accountMapper.selectOne(queryWrapper1);
//执行查询
//第2步:获取收款方
//创建条件构造器
QueryWrapper<Account> queryWrapper2 = new QueryWrapper<>();
queryWrapper2.eq("name", target);
Account accountTarget = accountMapper.selectOne(queryWrapper2);
//执行查询
//第3步:修改汇款方金额
accountSource.setMoney(accountSource.getMoney() - 200);
//调用mybatis-plus的修改的方法
int sourceResult = accountMapper.updateById(accountSource);
//第4步:修改收款方金额
accountTarget.setMoney(accountTarget.getMoney() + 200);
//调用mybatis-plus的修改的方法
int targetResult = accountMapper.updateById(accountTarget);
if (sourceResult > 0 && targetResult > 0) {
return true;
} else {
return false;
}
}
}
controller层
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;
@RestController
public class TestControll {
@Autowired
private AccountService accountService;
@RequestMapping("/test")
public String test(){
boolean isOK = accountService.transfer("A", "B", 200);
if (isOK){
return "转账成功";
}else{
return "转账失败";
}
}
}