基於通用 Mapper 編寫 api 接口 和 事務的傳播

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章