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

 更新时间:2023年09月28日 10:56:17   作者:bacawa  
本文主要介绍了Mybatis-plus获取雪花算法生成的ID并返回生成ID,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、MybatisPlus主键策略

  • AUTO: 使用数据库id自增策略控制id生成;
  • NONE: 不设置id生成策略;
  • INPUT: 用户手工输入id;
  • ASSIGN_ID:雪花算法生成id (可兼容数值型与字符串型);
  • ASSIGN_UUID: 以UUID生成算法作为id生成策略;

(1)Mybatis默认主键策略是@TableId(type = IdType.ASSIGN_ID) 这是默认策略雪花算法,此时主键类型可以是String,也可以是数据类型 bigint 无需数据表主键自增;
(2)@TableId(type = IdType.ASSIGN_AUTO) 是主键自增策略,该策略为跟随数据库表的主键递增策略,前提是数据库表的主键要设置为自增,因此数据表该主键字段要自增 一般选择int bigint ;
(3)@TableId(type = IdType.INPUT)该策略表示,必须由我们手动的插入id,否则无法添加数据,因此需要把数据表主键自增去掉;
(4)@TableId(type = IdType.NONE)NONE策略表示不指定主键生成策略,当我们没有指定主键生成策略或者主键策略为NONE的时候,则跟随的是全局策略 ,因此即使@TableId没有指定主键策略,用的也是雪花算法。

二、Mybatis-plus提前获取实体类用雪花算法生成的ID

在某些情况下,我们想提前获取这个ID,这样可以通过一些计算来生成其他字段的值。因为Mybatis-plus中内置了雪花算法生成功能,我们找出来调用就行了,完全不用手动去撸一遍算法。

算法具体实现在下面这个类中,就不大面积贴代码了

import com.baomidou.mybatisplus.core.toolkit.IdWorker;

我们可以这样调用,其中 entity 就是希望持久化的对象。

Long ID=IdWorker.getId(entity);

注意:拿到ID之后,需要手动将ID赋值到entity对象上;如果不手动赋值,执行完save()方法之后,又会重新生成一个ID,就跟上面方法取到的ID不一致了。

如果有更特别的需求,还可以设置雪花算法的其他参数。这个类源码如下,里面注释比较详细,希望可以帮到各位。

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 {
    /**
     * 主机和进程的机器码
     */
    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();
    }
    /**
     * 有参构造器
     *
     * @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获取更优的效果 去掉"-"
     */
    public static String get32UUID() {
        ThreadLocalRandom random = ThreadLocalRandom.current();
        return new UUID(random.nextLong(), random.nextLong()).toString().replace(StringPool.DASH, StringPool.EMPTY);
    }
}

三、MybatisPlus新增对象返回生成的ID

通过第二章节的介绍,想必大家已经有注意了,再执行完save()方法之后,MybatisPlus框架实际上帮助我们创建ID,赋值到实体对象上,然后将带有ID的对象进行持久化存储,所以这时候想要获取到生成的ID就比较容易了,参考代码如下:

save() 方法是MybatisPlus提前封装好的,直接调用即可。

save(entity);
System.out.println(entity.getId());    //保存完之后,直接可以获取到生成的ID

是不是很简单,当初我也是踩了不少坑,参考别人的帖子,又是修改Mapper,又是修改service等,一番操作功能可以实现,可是代码一点都不优雅了,忍不了,想着MybatisPlus这么牛掰,这个功能怎么会没有,所以仔细学习了MybatisPlus之后,成功出坑。

到此这篇关于Mybatis-plus获取雪花算法生成的ID并返回生成ID的文章就介绍到这了,更多相关Mybatis-plus 雪花算法生成ID内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Nacos下载、配置、整合项目方式

    使用Nacos下载、配置、整合项目方式

    这篇文章主要介绍了使用Nacos 下载、配置、整合项目方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java SE判断两个文件内容是否相同的多种方法代码

    Java SE判断两个文件内容是否相同的多种方法代码

    昨天因为要帮师兄的忙所以看了一下如何判断两个文件内容是否相同,这里给大家总结下,这篇文章主要给大家介绍了关于Java SE判断两个文件内容是否相同的多种方法,需要的朋友可以参考下
    2023-11-11
  • java如何删除以逗号隔开的字符串中某一个值

    java如何删除以逗号隔开的字符串中某一个值

    这篇文章主要介绍了java如何删除以逗号隔开的字符串中某一个值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • java编程多线程并发处理实例解析

    java编程多线程并发处理实例解析

    这篇文章主要介绍了java编程多线程并发处理实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java字符串中删除指定子字符串的方法简介

    Java字符串中删除指定子字符串的方法简介

    这篇文章主要介绍了Java字符串中删除指定子字符串的方法,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • java实现同态加密算法的实例代码

    java实现同态加密算法的实例代码

    这篇文章主要给大家介绍了关于java实现同态加密算法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java中HashSet和HashMap的区别_动力节点Java学院整理

    Java中HashSet和HashMap的区别_动力节点Java学院整理

    这篇文章主要介绍了Java中HashSet和HashMap的区别_动力节点Java学院整理,需要的朋友可以参考下
    2017-04-04
  • Java设计模式之java外观模式详解

    Java设计模式之java外观模式详解

    这篇文章主要介绍了Java设计模式之外观模式(Facade模式)介绍,外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面,需要的朋友可以参考下
    2021-09-09
  • 解决RestTemplate 请求接收自定义400+ 或500+错误

    解决RestTemplate 请求接收自定义400+ 或500+错误

    这篇文章主要介绍了解决RestTemplate 请求接收自定义400+ 或500+错误,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 关于SpringCloud的微服务以及组件详解

    关于SpringCloud的微服务以及组件详解

    这篇文章主要介绍了关于SpringCloud的微服务以及组件详解,是一个更高层次的、 架构视角的综合性大型项目, 他的目标是构建一套标准化的微服务解决方案,需要的朋友可以参考下
    2023-05-05

最新评论