Mybatis-plus學習(五)——MybatiPlus的自定義ID生成器和邏輯刪除詳解測試

陌意隨影發表於2020-12-06

5.自定義ID生成器

自mybatis-plus3.3.0開始,預設使用雪花演算法+UUID(不含中劃線)

5.1雪花演算法

snowflake是Twitter開源的分散式ID生成演算法,結果是一個long型的ID。其核心思想是:使用41bit作為
毫秒數,10bit作為機器的ID(5個bit是資料中心,5個bit的機器ID),12bit作為毫秒內的流水號(意味
著每個節點在每毫秒可以產生 4096 個 ID),最後還有一個符號位,永遠是0。可以保證幾乎全球唯一!

5.2配置主鍵自增

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Fl1MUJtI-1607187898024)(E:\新技術學習\java_study\mybatis-plus學習\images\image-20201125210143458.png)]

5.3在資料庫中配置主鍵自增

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-IjQZ4u5r-1607187898032)(E:\新技術學習\java_study\mybatis-plus學習\images\image-20201125210355729.png)]

5.4IdType的型別

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-hGCtrzSD-1607187898035)(E:\新技術學習\java_study\mybatis-plus學習\images\image-20201125210547295.png)]

  AUTO(0), // 資料庫id自增
  NONE(1), // 未設定主鍵
  INPUT(2), // 手動輸入
  ID_WORKER(3), // 預設的全域性唯一id
  UUID(4), // 全域性唯一id uuid
  ID_WORKER_STR(5); //ID_WORKER 字串表示法

5.5使用自定義的生成主鍵

方式一:宣告為Bean供Spring掃描注入

@Component
public class CustomIdGenerator implements IdentifierGenerator {
    @Override
    public Long nextId(Object entity) {
      	//可以將當前傳入的class全類名來作為bizKey,或者提取引數來生成bizKey進行分散式Id呼叫生成.
      	String bizKey = entity.getClass().getName();
        //根據bizKey呼叫分散式ID生成
        long id = ....;
      	//返回生成的id值即可.
        return id;
    }
}

方式二:使用配置類

@Bean
public IdentifierGenerator idGenerator() {
    return new CustomIdGenerator();
}

方式三:通過MybatisPlusPropertiesCustomizer自定義

@Bean
public MybatisPlusPropertiesCustomizer plusPropertiesCustomizer() {
    return plusProperties -> plusProperties.getGlobalConfig().setIdentifierGenerator(new CustomIdGenerator());
}

6.邏輯刪除

說明:

只對自動注入的sql起效:

  • 插入: 不作限制
  • 查詢: 追加where條件過濾掉已刪除資料,且使用 wrapper.entity 生成的where條件會忽略該欄位
  • 更新: 追加where條件防止更新到已刪除資料,且使用 wrapper.entity 生成的where條件會忽略該欄位
  • 刪除: 轉變為 更新

例如:

  • 刪除: update user set deleted=1 where id = 1 and deleted=0
  • 查詢: select id,name,deleted from user where deleted=0

欄位型別支援說明:

  • 支援所有資料型別(推薦使用 Integer,Boolean,LocalDateTime)
  • 如果資料庫欄位使用datetime,邏輯未刪除值和已刪除值支援配置為字串null,另一個值支援配置為函式來獲取值如now()

附錄:

  • 邏輯刪除是為了方便資料恢復和保護資料本身價值等等的一種方案,但實際就是刪除。
  • 如果你需要頻繁查出來看就不應使用邏輯刪除,而是以一個狀態去表示。

6.1使用方法:

6.2.1步驟1:

配置com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig

  • 例: application.yml
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag  # 全域性邏輯刪除的實體欄位名(since 3.3.0,配置後可以忽略不配置步驟2)
      logic-delete-value: 1 # 邏輯已刪除值(預設為 1)
      logic-not-delete-value: 0 # 邏輯未刪除值(預設為 0)

或者 application.properties中

# 全域性邏輯刪除的實體欄位名(since 3.3.0,配置後可以忽略不配置步驟2)
mybatis-plus.global-config.db-config.logic-delete-field=deleted
# 邏輯已刪除值(預設為 1)
mybatis-plus.global-config.db-config.logic-delete-value=1
# 邏輯未刪除值(預設為 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0

6.2.2步驟2:

實體類欄位上加上@TableLogic註解

@TableLogic
private Integer deleted;

6.3在springboot中使用

6.3.1在資料庫中增加欄位 deleted

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-tkPDwztG-1607187898039)(E:\新技術學習\java_study\mybatis-plus學習\images\image-20201125220421261.png)]

6.3.2在實體類中新增註釋

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Pm71WKGA-1607187898041)(E:\新技術學習\java_study\mybatis-plus學習\images\image-20201125220545245.png)]

6.3.3在application.properties中新增配置

server.port=8080
#資料庫連線的使用者名稱
spring.datasource.username=root
#資料庫連線的密碼
spring.datasource.password=root
#資料庫連線的URL
spring.datasource.url=jdbc:mysql://localhost:3306/javaweb?serverTimezone=UTC
#資料庫連線的驅動   MySQL8使用com.mysql.cj.jdbc.Driver   ,mysql5使用com.mysql.jdbc.Driver
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#配置日誌
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 全域性邏輯刪除的實體欄位名(since 3.3.0,配置後可以忽略不配置步驟2)
mybatis-plus.global-config.db-config.logic-delete-field=deleted
# 邏輯已刪除值(預設為 1)
mybatis-plus.global-config.db-config.logic-delete-value=1
# 邏輯未刪除值(預設為 0)
mybatis-plus.global-config.db-config.logic-not-delete-value=0

6.3.4測試

  @Test
    public void testGetOneById(){
        Account byId = accountService.getById(1);
        System.out.println(byId);
    }

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Esd3Ytx5-1607187898044)(E:\新技術學習\java_study\mybatis-plus學習\images\image-20201125222918802.png)]

可見我們在進行刪除時mybatisplus會自動新增條件轉換為更新語句。

7.測試的原始碼已上傳到GitHub中:https://github.com/LJF2402901363/java_study.git

在這裡插入圖片描述

8.本部落格已經同步到個人部落格,如有需要請移步:http://moyisuiying.com/index.php/mybatis/411.html

相關文章