MybatisPlus 主鍵策略(type=IdType.ASSIGN_ID等詳解)
阿新 • • 發佈:2021-01-12
地址:https://www.hangge.com/blog/cache/detail_2904.html
三,主鍵策略
我們可以通過@TableId註解的型別屬性來設定主鍵id的增長策略,一共有幾個多個主鍵策略,可根據情況自由配置。1,ASSIGN_ID(雪花演算法)
如果不設定型別值,預設則使用IdType.ASSIGN_ID策略(自3.3.0起)。該策略會使用雪花演算法自動生成主鍵ID,主鍵型別為長或字串(分別對應的MySQL的表字段為BIGINT和VARCHAR)
提示:該策略使用介面IdentifierGenerator的方法nextId(以實現類為DefaultIdentifierGenerator雪花演算法),下面是雪花演算法介紹:- 雪花演算法(雪花)是微博開源的分散式ID生成演算法其核心思想就是:使用一個64位的長型的數字作為全域性唯一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(插入前自行設定主鍵值)
(1)針對有序列的資料庫:Oracle,SQLServer等,當需要建立一個自增序列時,需要用到序列。 提示:- 在Oracle 11g中,設定自增擴,需要先建立序列(SQUENCE)再建立一個觸發器(TRIGGER)。
- 在Oracle 12c中,只需要使用IDENTITY屬性就可以了,和MySQL一樣簡單。
- DB2KeyGenerator
- H2KeyGenerator
- KingbaseKeyGenerator
- Oracle金鑰生成器
- 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型別的,也可以使用: 如何使用序列作為主鍵,但是實體主鍵型別是字串開頭,表的主鍵是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 )
public class YourEntity{
@TableId (value = "ID_STR" , type = IdType.INPUT)
private String idStr;
...
}
|
5,無(無狀態)
如果使用IdType.NONE策略,表示未設定主鍵型別(註解裡等於跟隨上下,左右里約等於INPUT)附:變數策略配置
假設我們希望完全全部都使用AUTO策略(資料庫ID自增),那麼可以在application.properties中新增如下配置進行修改:1個 |
mybatis-plus.global-config.db-config.id-type=auto
|