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
public  class  UserInfo {
     //指定主鍵生成策略使用雪花算法(默認策略)
     @TableId (type = IdType.ASSIGN_ID)
     private  Long id;
     private  String userName;
     private  String passWord;
}
哥倫比亞特區:SpringBoot-MyBatis-Plus使用詳解3(主鍵策略,UUID,Sequence)
 

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;
}
哥倫比亞特區:SpringBoot-MyBatis-Plus使用詳解3(主鍵策略,UUID,Sequence)
 

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;
}
哥倫比亞特區:SpringBoot-MyBatis-Plus使用詳解3(主鍵策略,UUID,Sequence)

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

(1)針對有序列的數據庫:Oracle SQLServer 等,當需要建立一個自增序列時,需要用到序列
提示:
  • 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
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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM