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)策略雪花算法,此時主鍵類型可以是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的時候,則跟隨的是全局策略 ,因此即使@TableId沒有指定主鍵策略,用的也是雪花算法。
二、Mybatis-plus提前獲取實體類用雪花算法生成的ID
在某些情況下,我們想提前獲取這個ID,這樣可以通過一些計算來生成其他字段的值。因為Mybatis-plus中內(nèi)置了雪花算法生成功能,我們找出來調(diào)用就行了,完全不用手動去擼一遍算法。
算法具體實現(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ìn)程的機器碼
*/
private static IdentifierGenerator IDENTIFIER_GENERATOR = new DefaultIdentifierGenerator();
/**
* 毫秒格式化時間
*/
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();
}
/**
* 格式化的毫秒時間
*/
public static String getMillisecond() {
return LocalDateTime.now().format(MILLISECOND);
}
/**
* 時間 ID = Time + ID
* <p>例如:可用于商品訂單 ID</p>
*/
public static String getTimeId() {
return getMillisecond() + getIdStr();
}
/**
* 有參構(gòu)造器
*
* @param workerId 工作機器 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框架實際上幫助我們創(chuàng)建ID,賦值到實體對象上,然后將帶有ID的對象進(jìn)行持久化存儲,所以這時候想要獲取到生成的ID就比較容易了,參考代碼如下:
save() 方法是MybatisPlus提前封裝好的,直接調(diào)用即可。
save(entity); System.out.println(entity.getId()); //保存完之后,直接可以獲取到生成的ID
是不是很簡單,當(dāng)初我也是踩了不少坑,參考別人的帖子,又是修改Mapper,又是修改service等,一番操作功能可以實現(xià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中l(wèi)ist.foreach()和list.stream().foreach()用法詳解
在Java中List是一種常用的集合類,用于存儲一組元素,List提供了多種遍歷元素的方式,包括使用forEach()方法和使用Stream流的forEach()方法,這篇文章主要給大家介紹了關(guān)于Java中l(wèi)ist.foreach()和list.stream().foreach()用法的相關(guān)資料,需要的朋友可以參考下2024-07-07
利用Spring Cloud Zuul實現(xiàn)動態(tài)路由示例代碼
Spring Cloud Zuul路由是微服務(wù)架構(gòu)的不可或缺的一部分,提供動態(tài)路由,監(jiān)控,彈性,安全等的邊緣服務(wù)。下面這篇文章主要給大家介紹了關(guān)于利用Spring Cloud Zuul實現(xiàn)動態(tài)路由的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09
使用Cloud Toolkit在IDEA中極速創(chuàng)建dubbo工程
這篇文章主要介紹了使用Cloud Toolkit在IDEA中極速創(chuàng)建dubbo工程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
MyBatis-Plus實現(xiàn)公共字段自動填充功能詳解
在開發(fā)中經(jīng)常遇到多個實體類有共同的屬性字段,這些字段屬于公共字段,也就是很多表中都有這些字段,能不能對于這些公共字段在某個地方統(tǒng)一處理,來簡化開發(fā)呢?MyBatis-Plus就提供了這一功能,本文就來為大家詳細(xì)講講2022-08-08

