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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring依赖注入成功但在调用接口的时候拿到的依赖却是null问题

    spring依赖注入成功但在调用接口的时候拿到的依赖却是null问题

    这篇文章主要介绍了spring依赖注入成功但在调用接口的时候拿到的依赖却是null问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java使用NIO优化IO实现文件上传下载功能

    Java使用NIO优化IO实现文件上传下载功能

    IO 是基于流来读取的,而NIO则是基于块读取,面向流 的 I/O 系统一次一个字节地处理数据,这篇文章主要介绍了Java使用NIO优化IO实现文件上传下载功能,需要的朋友可以参考下
    2022-07-07
  • Java读取xml文件的五种方式

    Java读取xml文件的五种方式

    在编写与 XML 数据交互的现代软件应用时,有效地读取和解析 XML 文件是至关重要的,本文旨在探讨 Java 中处理 XML 文件的五种主要方法:DOM、SAX、StAX、JAXB 和 JDOM,我们将详细介绍每种方法的工作原理、典型用途以及如何在 Java 程序中实现它们
    2024-05-05
  • 一文秒懂idea的git插件跟翻译插件

    一文秒懂idea的git插件跟翻译插件

    idea之类的开发软件真的超级多的插件,今天给大家分享idea的git插件跟翻译插件,感兴趣的朋友跟随小编一起看看吧
    2021-04-04
  • spring boot3整合AI组件及使用方法

    spring boot3整合AI组件及使用方法

    本文介绍了springboot开发后端服务中,AI组件(Spring AI)的整合与使用,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Java进阶:Struts多模块的技巧

    Java进阶:Struts多模块的技巧

    Java进阶:Struts多模块的技巧...
    2006-12-12
  • Spring自动扫描无法扫描jar包中bean的解决方法

    Spring自动扫描无法扫描jar包中bean的解决方法

    在日常开发中往往会对公共的模块打包发布,然后调用公共包的内容。然而,最近对公司的公共模块进行整理发布后。spring却无法扫描到相应的bean,下面这篇文章主要给大家介绍了关于Spring自动扫描时无法扫描jar包中bean的解决方法,需要的朋友可以参考下。
    2017-06-06
  • 关于Spring Bean实例过程中使用反射和递归处理的Bean属性填充问题

    关于Spring Bean实例过程中使用反射和递归处理的Bean属性填充问题

    本文带领大家一起学习下在Spring Bean实例过程中如何使用反射和递归处理的Bean属性填充,需要在类 AbstractAutowireCapableBeanFactory 的 createBean 方法中添加补全属性方法,具体操作方法跟随小编一起学习下吧
    2021-06-06
  • 在SpringBoot3中spring.factories配置不起作用的原因和解决方法

    在SpringBoot3中spring.factories配置不起作用的原因和解决方法

    本文给大家介绍了在SpringBoot3中spring.factories配置的自动装配不生效的原因和解决方法,文中通过代码和图文给出了详细的解决方法,具有一定的参考价值,需要的朋友可以参考下
    2024-02-02
  • java.lang.UnsupportedClassVersionError错误的解决办法(附图文)

    java.lang.UnsupportedClassVersionError错误的解决办法(附图文)

    这篇文章主要给大家介绍了关于java.lang.UnsupportedClassVersionError错误的解决办法,"java.lang.UnsupportedClassVersionError"意味着您正在运行的Java版本与编译该类时使用的Java版本不兼容,需要的朋友可以参考下
    2023-10-10

最新评论