MybatisPlus 主鍵策略的幾種實(shí)現(xiàn)方法
MybatisPlus-Plus提供了多種主鍵生成策略,我們可以通過(guò)@TableId注解的 類型屬性來(lái)設(shè)置主鍵id的增長(zhǎng)策略,一共有幾個(gè)多個(gè)主鍵策略,可根據(jù)情況自由配置。
主鍵策略
1、AUTO(自動(dòng)增長(zhǎng)策略)
AUTO自動(dòng)增長(zhǎng)策略,對(duì)于像MySQL這樣的支持主鍵自動(dòng)遞增的數(shù)據(jù)庫(kù),我們可以使用IdType.AUTO策略。
@Data public class UserInfo { //指定主鍵使用數(shù)據(jù)庫(kù)ID自增策略 @TableId(type = IdType.AUTO) private Integer id; private String userName; private String passWord; }
2、INPUT(插入前自行設(shè)置主鍵值)
自定義輸入策略:如果不想使用數(shù)據(jù)庫(kù)的自增主鍵,也可以使用INPUT進(jìn)行自己傳遞主鍵即可,進(jìn)行插入工作,但在插入之前一定要檢查數(shù)據(jù)庫(kù)是否已經(jīng)存在了該主鍵。
(1)針對(duì)有序列的數(shù)據(jù)庫(kù):Oracle,SQLServer等,當(dāng)需要建立一個(gè)自增序列時(shí),需要用到序列。
提示:
在Oracle 11g中,設(shè)置自增擴(kuò),需要先創(chuàng)建序列(SQUENCE)再創(chuàng)建一個(gè)觸發(fā)器(TRIGGER)。
在Oracle 12c中,只需要使用IDENTITY屬性就可以了,和MySQL一樣簡(jiǎn)單。
(2)Mybatis-Plus已經(jīng)定義好了常見(jiàn)的數(shù)據(jù)庫(kù)主鍵序列,我們首先只需要在@Configuration類中定義好@Bean:Mybatis -Plus內(nèi)置了如下數(shù)據(jù)庫(kù)主鍵序列(如果內(nèi)置支持不滿足你的需求,可實(shí)現(xiàn)IKeyGenerator接口來(lái)進(jìn)行擴(kuò)展):
DB2KeyGenerator
H2KeyGenerator
KingbaseKeyGenerator
OracleKeyGenerator
PostgreKeyGenerator
(3)然后實(shí)體類配置主鍵 Sequence,指定主鍵策略為IdType.INPUT即可:
@Data @KeySequence(value = "SEQ_ACL_ROLE" , clazz = Integer.class) public class AclUser implements Serializable { private static final long serialVersionUID = 780903014942735924L; @TableId(value = "ID",type = IdType.INPUT) private Integer id;
3、ASSING_ID(雪花算法)
如果不設(shè)置類型值,默認(rèn)則使用IdType.ASSIGN_ID策略(自3.3.0起)。該策略會(huì)使用雪花算法自動(dòng)生成主鍵ID,主鍵類型為L(zhǎng)ong或String(分別對(duì)應(yīng)的MySQL的表字段為BIGINT和VARCHAR)
雪花算法(SnowFlake)是 Twitter 開(kāi)源的分布式 id 生成算法。其核心思想就是:使用一個(gè) 64 bit 的 long 型的數(shù)字作為全局唯一 id。在分布式系統(tǒng)中的應(yīng)用十分廣泛,且 ID 引入了時(shí)間戳,基本上保持自增的。
@Data public class UserInfo { //指定主鍵生成策略使用雪花算法(默認(rèn)策略) @TableId(type = IdType.ASSIGN_ID) private Long id; private String userName; private String passWord; }
4、ASSING_UUID(不含中劃線的UUID)
如果使用IdType.ASSIGN_UUID策略,并重新自動(dòng)生成排除中劃線的UUID作為主鍵。主鍵類型為String,對(duì)應(yīng)MySQL的表分段為VARCHAR(32)
@Data public class UserInfo { //指定主鍵生成策略為不含中劃線的UUID @TableId(type = IdType.ASSIGN_UUID) private String id; private String userName; private String passWord; }
5、NONE(無(wú)狀態(tài))
如果使用 IdType.NONE 策略,表示未設(shè)置主鍵類型(注解里等于跟隨全局,全局里約等于 INPUT)
雪花算法
算法介紹
雪花算法的原理就是生成一個(gè)的 64 位比特位的 long 類型的唯一 id。
1.最高 1 位固定值 0,因?yàn)樯傻?id 是正整數(shù),如果是 1 就是負(fù)數(shù)了。
2.接下來(lái) 41 位存儲(chǔ)毫秒級(jí)時(shí)間戳,2^41/(1000*60*60*24*365)=69,大概可以使用 69 年。
3.再接下 10 位存儲(chǔ)機(jī)器碼,包括 5 位 datacenterId 和 5 位 workerId。最多可以部署 2^10=1024 臺(tái)機(jī)器。
4.最后 12 位存儲(chǔ)序列號(hào)。同一毫秒時(shí)間戳?xí)r,通過(guò)這個(gè)遞增的序列號(hào)來(lái)區(qū)分。即對(duì)于同一臺(tái)機(jī)器而言,同一毫秒時(shí)間戳下,可以生成 2^12=4096 個(gè)不重復(fù) id。
可以將雪花算法作為一個(gè)單獨(dú)的服務(wù)進(jìn)行部署,然后需要全局唯一 id 的系統(tǒng),請(qǐng)求雪花算法服務(wù)獲取id 即可。
對(duì)于每一個(gè)雪花算法服務(wù),需要先指定 10 位的機(jī)器碼,這個(gè)根據(jù)自身業(yè)務(wù)進(jìn)行設(shè)定即可。例如機(jī)房號(hào)+機(jī)器號(hào),機(jī)器號(hào)+服務(wù)號(hào),或者是其他可區(qū)別標(biāo)識(shí)的 10 位比特位的整數(shù)值都行。
算法優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
高并發(fā)分布式環(huán)境下生成不重復(fù) id,每秒可生成百萬(wàn)個(gè)不重復(fù) id。
基于時(shí)間戳,以及同一時(shí)間戳下序列號(hào)自增,基本保證 id 有序遞增。
不依賴第三方庫(kù)或者中間件。
算法簡(jiǎn)單,在內(nèi)存中進(jìn)行,效率高。
缺點(diǎn):
依賴服務(wù)器時(shí)間,服務(wù)器時(shí)鐘回?fù)軙r(shí)可能會(huì)生成重復(fù) id。算法中可通過(guò)記錄最后一個(gè)生成 id 時(shí)的時(shí)間戳來(lái)解決,每次生成 id 之前比較當(dāng)前服務(wù)器時(shí)鐘是否被回?fù)?,避免生成重?fù) id。
到此這篇關(guān)于MybatisPlus 主鍵策略的幾種實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)MybatisPlus 主鍵策略內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的長(zhǎng)輪詢的示例代碼
長(zhǎng)輪詢是與服務(wù)器保持即時(shí)通信的最簡(jiǎn)單的方式,它不使用任何特定的協(xié)議,例如 WebSocket ,所以也不依賴于瀏覽器版本等外部條件的兼容性。本文將用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的長(zhǎng)輪詢,需要的可以參考一下2022-08-08SpringBoot中Formatter和Converter用法和區(qū)別小結(jié)
本文主要介紹了SpringBoot中Formatter和Converter用法和區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Spring三種方法的注解自動(dòng)注入問(wèn)題
這篇文章主要介紹了Spring三種方法的注解自動(dòng)注入問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12Mybatis實(shí)現(xiàn)分包定義數(shù)據(jù)庫(kù)的原理與過(guò)程
這篇文章主要給大家介紹了關(guān)于Mybatis實(shí)現(xiàn)分包定義數(shù)據(jù)庫(kù)的原理與過(guò)程,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01Spring為何要用三級(jí)緩存來(lái)解決循環(huán)依賴問(wèn)題
這篇文章主要給大家介紹了關(guān)于Spring為何要用三級(jí)緩存來(lái)解決循環(huán)依賴問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10Java Scanner的使用和hasNextXXX()的用法說(shuō)明
這篇文章主要介紹了Java Scanner的使用和hasNextXXX()的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java分頁(yè)簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java分頁(yè)簡(jiǎn)介的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08