地址: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
的方法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(插入前自行設置主鍵值)
(1)針對有序列的數據庫:Oracle ,SQLServer 等,當需要建立一個自增序列時,需要用到序列 。
提示:
- 在Oracle 11g中,設置自增擴,需要先創建序列(SQUENCE)再創建一個觸發器(TRIGGER)。
- 在Oracle 12c中,只需要使用IDENTITY屬性就可以了,和MySQL一樣簡單。
(2)Mybatis -Plus
已經定義好了常見的數據庫主鍵序列,我們首先只需要在@Configuration
類中定義好@Bean
:
(3)然后實體類配置主鍵Sequence ,指定主鍵策略為IdType.INPUT 即可:
(4)如果主鍵是String 類型的,也可以使用:
Mybatis -Plus內置了如下數據庫主鍵序列(如果內置支持不滿足你的需求,可實現IKeyGenerator
接口來進行擴展):
- 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
|