如何 基於通用 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(增刪改)