Mybatis-plus获取雪花算法生成的ID并返回生成ID
作者:bacawa
一、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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!