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

相关文章

  • Java中list.foreach()和list.stream().foreach()用法详解

    Java中list.foreach()和list.stream().foreach()用法详解

    在Java中List是一种常用的集合类,用于存储一组元素,List提供了多种遍历元素的方式,包括使用forEach()方法和使用Stream流的forEach()方法,这篇文章主要给大家介绍了关于Java中list.foreach()和list.stream().foreach()用法的相关资料,需要的朋友可以参考下
    2024-07-07
  • 利用Spring Cloud Zuul实现动态路由示例代码

    利用Spring Cloud Zuul实现动态路由示例代码

    Spring Cloud Zuul路由是微服务架构的不可或缺的一部分,提供动态路由,监控,弹性,安全等的边缘服务。下面这篇文章主要给大家介绍了关于利用Spring Cloud Zuul实现动态路由的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • 使用Cloud Toolkit在IDEA中极速创建dubbo工程

    使用Cloud Toolkit在IDEA中极速创建dubbo工程

    这篇文章主要介绍了使用Cloud Toolkit在IDEA中极速创建dubbo工程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 深入解析java中的值传递和引用传递

    深入解析java中的值传递和引用传递

    这篇文章主要介绍了深入解析java中的值传递和引用传递,值传递是将变量的值复制给另一个变量,两个变量之间并没有直接关系,引用传递是将变量的引用(内存地址)传递给另一个变量,两个变量之间指向同一个内存地址,修改一个变量的值也会影响到另一个变量
    2023-07-07
  • MyBatis-Plus实现公共字段自动填充功能详解

    MyBatis-Plus实现公共字段自动填充功能详解

    在开发中经常遇到多个实体类有共同的属性字段,这些字段属于公共字段,也就是很多表中都有这些字段,能不能对于这些公共字段在某个地方统一处理,来简化开发呢?MyBatis-Plus就提供了这一功能,本文就来为大家详细讲讲
    2022-08-08
  • 详解Springboot之接收json字符串的两种方式

    详解Springboot之接收json字符串的两种方式

    这篇文章主要介绍了Springboot之接收json字符串的两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java正则表达式之分组和替换方式

    Java正则表达式之分组和替换方式

    这篇文章主要介绍了Java正则表达式之分组和替换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java基础元注解基本原理示例详解

    Java基础元注解基本原理示例详解

    这篇文章主要为大家介绍了Java基础元注解基本原理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Java中常用的设计模式之装饰器模式详解

    Java中常用的设计模式之装饰器模式详解

    这篇文章主要为大家详细介绍了Java中常用的设计模式之装饰器模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Java动态调用类中方法代码

    Java动态调用类中方法代码

    这篇文章主要介绍了Java动态调用类中方法代码,需要的朋友可以参考下
    2014-02-02

最新评论