基于通用 Mapper 编写 api 接口 和 事务的传播
程序员文章站
2022-03-28 11:13:57
...
如何 基于通用 Mapper 编写 api 接口
1. 在 数据库中新建一张 stu 学生 表
通过数据库逆向工具生成 各种需要的文件
2. 在 foodie-service层 com.imooc.service 编写接口
package com.imooc.service;
import com.imooc.pojo.Stu;
public interface StuService {
public Stu getStuInfo(int id);
public void saveStu();
public void updateStu(int id);
public void deleteStu(int id);
}
2,在service 下新建 impl包,编写 serviceImpl 实现刚才的接口
package com.imooc.service.impl;
import com.imooc.mapper.StuMapper;
import com.imooc.pojo.Stu;
import com.imooc.service.StuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service
public class StuServiceImpl implements StuService {
@Autowired
private StuMapper stuMapper; // 注入mapper
@Transactional(propagation = Propagation.SUPPORTS) // 事务支持
@Override
public Stu getStuInfo(int id) {
return stuMapper.selectByPrimaryKey(id); // 通用mapper 提供的方法
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void saveStu() {
Stu stu = new Stu(); // 模拟增加
stu.setName("jack");
stu.setAge(18);
stuMapper.insert(stu);
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void updateStu(int id) { // 模拟更新
Stu stu = new Stu();
stu.setId(id);
stu.setName("zhangsan");
stu.setAge(20);
stuMapper.updateByPrimaryKey(stu);
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void deleteStu(int id) {
stuMapper.deleteByPrimaryKey(id);
}
}
** 3.在 启动类中 加入要扫描的 mapper包***
@SpringBootApplication
@MapperScan(basePackages = "com.imooc.mapper") // tk.mybatis **注意是 是哪个包下的**
// 扫描所有需要的包,相关组件包
@ComponentScan(basePackages = {"com.imooc"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
4. 编写 StuController 方法测试
package com.imooc.controller;
import com.imooc.service.StuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
@RestController // @RestController注解相当于@ResponseBody + @Controller合在一起的作用
public class StuController {
@Autowired
private StuService stuService; // 注入 service
@GetMapping("/getStu")
public Object getStu(int id){
return stuService.getStuInfo(id);
}
@PostMapping("/saveStu")
public Object saveStu(int id){
stuService.saveStu();
return "insert ok";
}
@PostMapping("/updateStu")
public Object updateStu(int id){
stuService.updateStu(id);
return "update ok";
}
@PostMapping("/deleteStu")
public Object deleteStu(int id){
stuService.deleteStu(id);
return "delete ok";
}
}
5.测试方法,使用postman 测试
加入数据后,测试查询
测试 添加
测试 更新数据
数据库 结果 id=1230 被修改
删除测试
测试结果 同我们想要的一致
二.事务的传播
PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED 相同
经常使用的如 SUPPORTS(一般查询), REQUIRED(增删改)
上一篇: Logger android日志工具
下一篇: Vue实现tab切换效果