欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mybatis-plus獲取雪花算法生成的ID并返回生成ID

 更新時(shí)間:2023年09月28日 10:56:17   作者:bacawa  
本文主要介紹了Mybatis-plus獲取雪花算法生成的ID并返回生成ID,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、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)文章

最新評論