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之后,成功出坑。

(完成)

猜你喜欢

转载自blog.csdn.net/bacawa/article/details/131686367