SpringBoot - MyBatis-Plus使用詳解(主鍵策略、UUID、Sequence)
阿新 • • 發佈:2022-04-22
三、主鍵策略
我們可以通過 @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 的方法 nextUUID1 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