1. 程式人生 > 其它 >SpringBoot - MyBatis-Plus使用詳解(主鍵策略、UUID、Sequence)

SpringBoot - MyBatis-Plus使用詳解(主鍵策略、UUID、Sequence)

三、主鍵策略

我們可以通過 @TableId 註解的 type 屬性來設定主鍵 id 的增長策略,一共有如下幾種主鍵策略,可根據情況自由配置。

1,ASSIGN_ID(雪花演算法)

    如果不設定 type 值,預設則使用 IdType.ASSIGN_ID 策略(自 3.3.0 起)。該策略會使用雪花演算法自動生成主鍵 ID,主鍵型別為 Long 或 String(分別對應 MySQL 的表字段為 BIGINT 和 VARCHAR) 提示:該策略使用介面 IdentifierGenerator 的方法 nextId(預設實現類為 DefaultIdentifierGenerator 雪花演算法),下面是雪花演算法介紹:
  • 雪花演算法(SnowFlake)是 Twitter 開源的分散式 id 生成演算法。其核心思想就是:使用一個 64 bit 的 long 型的數字作為全域性唯一 id。在分散式系統中的應用十分廣泛,且 ID 引入了時間戳,基本上保持自增的。
1 2 3 4 5 6 7 8 @Data public class UserInfo {     //指定主鍵生成策略使用雪花演算法(預設策略)     @TableId(type = IdType.ASSIGN_ID)     private Long id;     private String userName;
    private String passWord; }

2,ASSIGN_UUID(不含中劃線的UUID)

    如果使用 IdType.ASSIGN_UUID 策略,則會自動生成不含中劃線的 UUID 作為主鍵。主鍵型別為 String,對應 MySQL 的表字段為 VARCHAR(32) 提示:該策略使用介面 IdentifierGenerator 的方法 nextUUID
1 2 3 4 5 6 7 8 @Data public class UserInfo {     //指定主鍵生成策略為不含中劃線的UUID     @TableId
(type = IdType.ASSIGN_UUID)     private String id;     private String userName;     private String passWord; }

3,AUTO(資料庫 ID 自增)

對於像 MySQL 這樣的支援主鍵自動遞增的資料庫,我們可以使用 IdType.AUTO 策略。
1 2 3 4 5 6 7 8 @Data public class UserInfo {     //指定主鍵使用資料庫ID自增策略     @TableId(type = IdType.AUTO)     private Integer id;     private String userName;     private String passWord; }

4,INPUT(insert 前自行 set 主鍵值)

(1)針對有序列的資料庫:比如 Oracle,SQLServer 等,當需要建立一個自增欄位時,需要用到 sequence。 提示:
  • Oracle 11g 中,設定自增欄位,需要先建立序列(SQUENCE)再建立一個觸發器(TRIGGER)。
  • Oracle 12c 中,只需要使用 IDENTITY 屬性就可以了,和 MySQL 一樣簡單。

(2)Mybatis-Plus 已經定義好了常見的資料庫主鍵序列,我們首先只需要在 @Configuration 類中定義好 @Bean: Mybatis-Plus 內建瞭如下資料庫主鍵序列(如果內建支援不滿足你的需求,可實現 IKeyGenerator 介面來進行擴充套件):
  • DB2KeyGenerator
  • H2KeyGenerator
  • KingbaseKeyGenerator
  • OracleKeyGenerator
  • PostgreKeyGenerator
1 2 3 4 @Bean public OracleKeyGenerator oracleKeyGenerator(){     return new OracleKeyGenerator(); }

(3)然後實體類配置主鍵 Sequence,指定主鍵策略為 IdType.INPUT 即可:
提示:支援父類定義 @KeySequence 子類使用,這樣就可以幾個表共用一個 Sequence
1 2 3 4 5 6 7 @TableName("TEST_SEQUSER") @KeySequence("SEQ_TEST")//類註解 public class TestSequser{   @TableId(value = "ID", type = IdType.INPUT)   private Long id;   }

(4)如果主鍵是 String 型別的,也可以使用:
如何使用 Sequence 作為主鍵,但是實體主鍵型別是 String 也就是說,表的主鍵是 varchar2,但是需要從 sequence 中取值
  • 實體定義 @KeySequence 註解 clazz 指定型別 String.class
  • 實體定義主鍵的型別 String
  • 注意:oracle 的 sequence 返回的是 Long 型別,如果主鍵型別是 Integer,可能會引起 ClassCastException
1 2 3 4 5 6 7 @KeySequence(value = "SEQ_ORACLE_STRING_KEY", clazz = String.class) public class YourEntity{           @TableId(value = "ID_STR", type = IdType.INPUT)     private String idStr;     ... }

5,NONE(無狀態)

如果使用 IdType.NONE 策略,表示未設定主鍵型別(註解裡等於跟隨全域性,全局裡約等於 INPUT)

附:全域性策略配置

    假設我們希望預設全部都使用 AUTO 策略(資料庫 ID 自增),那麼可以在 application.properties 中新增如下配置進行修改:
1 mybatis-plus.global-config.db-config.id-type=auto

原文出自:www.hangge.com  轉載請保留原文連結:https://www.hangge.com/blog/cache/detail_2904.html