Mybatis-plus獲取雪花算法生成的ID并返回生成ID
一、MybatisPlus主鍵策略
- AUTO: 使用數(shù)據(jù)庫id自增策略控制id生成;
- NONE: 不設(shè)置id生成策略;
- INPUT: 用戶手工輸入id;
- ASSIGN_ID:雪花算法生成id (可兼容數(shù)值型與字符串型);
- ASSIGN_UUID: 以UUID生成算法作為id生成策略;
(1)Mybatis默認(rèn)主鍵策略是@TableId(type = IdType.ASSIGN_ID) 這是默認(rèn)策略雪花算法,此時(shí)主鍵類型可以是String,也可以是數(shù)據(jù)類型 bigint 無需數(shù)據(jù)表主鍵自增;
(2)@TableId(type = IdType.ASSIGN_AUTO) 是主鍵自增策略,該策略為跟隨數(shù)據(jù)庫表的主鍵遞增策略,前提是數(shù)據(jù)庫表的主鍵要設(shè)置為自增,因此數(shù)據(jù)表該主鍵字段要自增 一般選擇int bigint ;
(3)@TableId(type = IdType.INPUT)該策略表示,必須由我們手動的插入id,否則無法添加數(shù)據(jù),因此需要把數(shù)據(jù)表主鍵自增去掉;
(4)@TableId(type = IdType.NONE)NONE策略表示不指定主鍵生成策略,當(dāng)我們沒有指定主鍵生成策略或者主鍵策略為NONE的時(shí)候,則跟隨的是全局策略 ,因此即使@TableId沒有指定主鍵策略,用的也是雪花算法。
二、Mybatis-plus提前獲取實(shí)體類用雪花算法生成的ID
在某些情況下,我們想提前獲取這個ID,這樣可以通過一些計(jì)算來生成其他字段的值。因?yàn)镸ybatis-plus中內(nèi)置了雪花算法生成功能,我們找出來調(diào)用就行了,完全不用手動去擼一遍算法。
算法具體實(shí)現(xiàn)在下面這個類中,就不大面積貼代碼了
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
我們可以這樣調(diào)用,其中 entity 就是希望持久化的對象。
Long ID=IdWorker.getId(entity);
注意:拿到ID之后,需要手動將ID賦值到entity對象上;如果不手動賦值,執(zhí)行完save()方法之后,又會重新生成一個ID,就跟上面方法取到的ID不一致了。
如果有更特別的需求,還可以設(shè)置雪花算法的其他參數(shù)。這個類源碼如下,里面注釋比較詳細(xì),希望可以幫到各位。
package com.baomidou.mybatisplus.core.toolkit; import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator; import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.UUID; import java.util.concurrent.ThreadLocalRandom; /** * id 獲取器 * */ public class IdWorker { /** * 主機(jī)和進(jìn)程的機(jī)器碼 */ private static IdentifierGenerator IDENTIFIER_GENERATOR = new DefaultIdentifierGenerator(); /** * 毫秒格式化時(shí)間 */ public static final DateTimeFormatter MILLISECOND = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"); /** * 獲取唯一ID * * @return id */ public static long getId() { return getId(new Object()); } /** * 獲取唯一ID * * @return id */ public static long getId(Object entity) { return IDENTIFIER_GENERATOR.nextId(entity).longValue(); } /** * 獲取唯一ID * * @return id */ public static String getIdStr() { return getIdStr(new Object()); } /** * 獲取唯一ID * * @return id */ public static String getIdStr(Object entity) { return IDENTIFIER_GENERATOR.nextId(entity).toString(); } /** * 格式化的毫秒時(shí)間 */ public static String getMillisecond() { return LocalDateTime.now().format(MILLISECOND); } /** * 時(shí)間 ID = Time + ID * <p>例如:可用于商品訂單 ID</p> */ public static String getTimeId() { return getMillisecond() + getIdStr(); } /** * 有參構(gòu)造器 * * @param workerId 工作機(jī)器 ID * @param dataCenterId 序列號 * @see #setIdentifierGenerator(IdentifierGenerator) */ public static void initSequence(long workerId, long dataCenterId) { IDENTIFIER_GENERATOR = new DefaultIdentifierGenerator(workerId, dataCenterId); } /** * 自定義id 生成方式 * * @param identifierGenerator id 生成器 * @see GlobalConfig#setIdentifierGenerator(IdentifierGenerator) */ public static void setIdentifierGenerator(IdentifierGenerator identifierGenerator) { IDENTIFIER_GENERATOR = identifierGenerator; } /** * 使用ThreadLocalRandom獲取UUID獲取更優(yōu)的效果 去掉"-" */ public static String get32UUID() { ThreadLocalRandom random = ThreadLocalRandom.current(); return new UUID(random.nextLong(), random.nextLong()).toString().replace(StringPool.DASH, StringPool.EMPTY); } }
三、MybatisPlus新增對象返回生成的ID
通過第二章節(jié)的介紹,想必大家已經(jīng)有注意了,再執(zhí)行完save()方法之后,MybatisPlus框架實(shí)際上幫助我們創(chuàng)建ID,賦值到實(shí)體對象上,然后將帶有ID的對象進(jìn)行持久化存儲,所以這時(shí)候想要獲取到生成的ID就比較容易了,參考代碼如下:
save() 方法是MybatisPlus提前封裝好的,直接調(diào)用即可。
save(entity); System.out.println(entity.getId()); //保存完之后,直接可以獲取到生成的ID
是不是很簡單,當(dāng)初我也是踩了不少坑,參考別人的帖子,又是修改Mapper,又是修改service等,一番操作功能可以實(shí)現(xiàn),可是代碼一點(diǎn)都不優(yōu)雅了,忍不了,想著MybatisPlus這么牛掰,這個功能怎么會沒有,所以仔細(xì)學(xué)習(xí)了MybatisPlus之后,成功出坑。
到此這篇關(guān)于Mybatis-plus獲取雪花算法生成的ID并返回生成ID的文章就介紹到這了,更多相關(guān)Mybatis-plus 雪花算法生成ID內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?SE判斷兩個文件內(nèi)容是否相同的多種方法代碼
昨天因?yàn)橐獛蛶熜值拿λ钥戳艘幌氯绾闻袛鄡蓚€文件內(nèi)容是否相同,這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Java?SE判斷兩個文件內(nèi)容是否相同的多種方法,需要的朋友可以參考下2023-11-11java實(shí)現(xiàn)同態(tài)加密算法的實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)同態(tài)加密算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Java中HashSet和HashMap的區(qū)別_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java中HashSet和HashMap的區(qū)別_動力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-04-04解決RestTemplate 請求接收自定義400+ 或500+錯誤
這篇文章主要介紹了解決RestTemplate 請求接收自定義400+ 或500+錯誤,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08關(guān)于SpringCloud的微服務(wù)以及組件詳解
這篇文章主要介紹了關(guān)于SpringCloud的微服務(wù)以及組件詳解,是一個更高層次的、 架構(gòu)視角的綜合性大型項(xiàng)目, 他的目標(biāo)是構(gòu)建一套標(biāo)準(zhǔn)化的微服務(wù)解決方案,需要的朋友可以參考下2023-05-05