1. 程式人生 > 實用技巧 >MybatisPlus 主鍵策略(type=IdType.ASSIGN_ID等詳解)

MybatisPlus 主鍵策略(type=IdType.ASSIGN_ID等詳解)

地址:https://www.hangge.com/blog/cache/detail_2904.html

三,主鍵策略

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

1,ASSIGN_ID(雪花演算法)

如果不設定型別值,預設則使用IdType.ASSIGN_ID策略(自3.3.0起)。該策略會使用雪花演算法自動生成主鍵ID,主鍵型別為字串(分別對應的MySQL的表字段為BIGINTVARCHAR

提示:該策略使用介面IdentifierGenerator的方法nextId(以實現類為DefaultIdentifierGenerator雪花演算法),下面是雪花演算法介紹:

  • 雪花演算法(雪花)是微博開源的分散式ID生成演算法其核心思想就是:使用一個64位型的數字作為全域性唯一ID。在分散式系統中的應用十分廣泛,且ID引入了時間戳,基本上保持自增的。
1個 2 3 4 5 6 7 8 @Data publicclassUserInfo { //指定主鍵生成策略使用雪花演算法(預設策略) @TableId(type = IdType.ASSIGN_ID) privateLong id; privateString userName; privateString passWord; }

2,ASSIGN_UUID(排除中劃線的UUID)

如果使用IdType.ASSIGN_UUID策略,並重新自動生成排除中劃線的UUID作為主鍵。主鍵型別為String,對應MySQL的表分段為VARCHAR(32)

提示:該策略使用介面IdentifierGenerator的方法nextUUID
1個 2 3 4 5 6 7 8 @Data publicclassUserInfo { //指定主鍵生成策略為不含中劃線的UUID @TableId(type = IdType.ASSIGN_UUID) privateString id; privateString userName; privateString passWord;
}

3,AUTO(資料庫ID自增)

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

4,INPUT(插入前自行設定主鍵值)

(1)針對有序列的資料庫:OracleSQLServer等,當需要建立一個自增序列時,需要用到序列 提示:
  • Oracle 11g中,設定自增擴,需要先建立序列(SQUENCE)再建立一個觸發器(TRIGGER)。
  • Oracle 12c中,只需要使用IDENTITY屬性就可以了,和MySQL一樣簡單。
(2)Mybatis-Plus已經定義好了常見的資料庫主鍵序列,我們首先只需要在@Configuration類中定義好@Bean Mybatis-Plus內建瞭如下資料庫主鍵序列(如果內建支援不滿足你的需求,可實現IKeyGenerator介面來進行擴充套件):
  • DB2KeyGenerator
  • H2KeyGenerator
  • KingbaseKeyGenerator
  • Oracle金鑰生成器
  • PostgreKeyGenerator
1個 2 3 4 @Bean publicOracleKeyGenerator oracleKeyGenerator(){ returnnewOracleKeyGenerator(); }

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

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

5,無(無狀態)

如果使用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