mybatis-plus 如何使用雪花算法ID生成策略
作者:WannaRunning 发布时间:2023-04-06 07:15:38
标签:mybatis-plus,雪花算法,ID,生成策略
mybatis-plus 可以通过@TableId注解指定主键生成策略
@TableId(value="id",type=IdType.ASSIGN_ID)
值 | 描述 |
---|---|
AUTO | 数据库ID自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
INPUT | insert前自行set主键值 |
ASSIGN_ID | 分配ID(主键类型为Number(Long和Integer)或String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) |
ASSIGN_UUID | 分配UUID,主键类型为String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认default方法) |
ID_WORKER | 分布式全局唯一ID 长整型类型(please use ASSIGN_ID) |
UUID | 32位UUID字符串(please use ASSIGN_UUID) |
ID_WORKER_STR | 分布式全局唯一ID 字符串类型(please use ASSIGN_ID) |
上面的注解设置了值,对应在MybatisDefaultParameterHandler中有判断这个类型和设置ID的处理,判断idType.getKey() == IdType.ASSIGN_ID.getKey()时,使用identifierGenerator.nextId(entity)创建了一个雪花算法ID。
protected static void populateKeys(TableInfo tableInfo, MetaObject metaObject, Object entity) {
IdType idType = tableInfo.getIdType();
String keyProperty = tableInfo.getKeyProperty();
if (StringUtils.isNotBlank(keyProperty) && null != idType && idType.getKey() >= 3) {
IdentifierGenerator identifierGenerator = GlobalConfigUtils.getGlobalConfig(tableInfo.getConfiguration()).getIdentifierGenerator();
Object idValue = metaObject.getValue(keyProperty);
if (StringUtils.checkValNull(idValue)) {
if (idType.getKey() == IdType.ASSIGN_ID.getKey()) {
if (Number.class.isAssignableFrom(tableInfo.getKeyType())) {
metaObject.setValue(keyProperty, identifierGenerator.nextId(entity));
} else {
metaObject.setValue(keyProperty, identifierGenerator.nextId(entity).toString());
}
} else if (idType.getKey() == IdType.ASSIGN_UUID.getKey()) {
metaObject.setValue(keyProperty, identifierGenerator.nextUUID(entity));
}
}
}
}
3.X版本后默认就是使用 IdType.ASSIGN_ID,即雪花算法,如果需要使用主键自增,则需要修改IdType.AUTO
看一下源码大概找一下雪花算法的实现方式
首先来看主键生成策略的接口是IdentifierGenerator。mp中默认有一个实现类就是DefaultIdentifierGenerator,这个就是雪花算法的实现类。这个类中使用的Sequence就是雪花算法的实现类了。
如果想自己创建雪花算法手动创建ID怎么办
com.baomidou.mybatisplus.core.toolkit包下有一个IdWork的类,这个类就是使用上面的DefaultIdentifierGenerator来获取雪花算法ID,我们可以直接使用IdWork同名方法getId或者getIdStr来手动获取一个雪花算法ID。
Long id=IdWorker.getIdStr()
自定义ID生成器实现
第一种,使用spring扫描注解创建bean使用
@Component
public class CustomIdGenerator implements IdentifierGenerator {
@Override
public Long nextId(Object entity) {
//可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.
String bizKey = entity.getClass().getName();
//根据bizKey调用分布式ID生成
long id = ....;
//返回生成的id值即可.
return id;
}
}
第二种,直接把写好的CustomIdGenerator实现类配置为一个bean
@Bean
public IdentifierGenerator idGenerator() {
return new CustomIdGenerator();
}
Mybatis-plus 中生成雪花算法id的工具类
public static void main(String[] args) {
// 返回值 1385106677482582018
System.out.println(IdWorker.getId());
// 返回值 "1385106677482582019"
System.out.println(IdWorker.getIdStr());
}
来源:https://fengkay.blog.csdn.net/article/details/108640697


猜你喜欢
- 这篇文章主要介绍了SpringBoot下如何实现支付宝接口的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 目录背景Shutdown Hook 介绍关闭钩子被调用场景注意事项实践Shutdown Hook 在 Spring 中的运用背景如果想在 J
- 本文实例为大家分享了Java多线程实现第三方数据同步的具体代码,供大家参考,具体内容如下一、场景最近的一项开发任务是同步第三方数据,而第三方
- 在项目中,时常会有异步调用的需求web.xml配置<servlet> <description>spri
- 1.狂妄的WPF相对传统的Windows图形编程,需要做很多复杂的工作,引用许多不同的API。例如:WinForm(带控件表单)、GDI+(
- 前言MyBatis常用标签及标签使用技巧MyBatis的常用标签有很多,比如<sql id="">:预定义可
- 在阅读本文之前,大家可以先参考下《多模字符串匹配算法原理及Java实现代码》简介:本文是博主自身对AC自动机的原理的一些理解和看法,主要以举
- zuul动态路由网关服务是流量的唯一入口。不能随便停服务。所以动态路由就显得尤为必要。数据库动态路由基于事件刷新机制热修改zuul的路由属性
- 看完本文你将了解:ACTION_CANCEL的触发时机滑出子View区域会发生什么?为什么不响应onClick()事件首先看一下官方的解释:
- 一、RatingBar简单介绍RatingBar是基于SeekBar(拖动条)和ProgressBar(状态条)的扩展,用星形来显示等级评定
- C#是一门强类型语言,一般情况下最好避免将一个类型转换成另一个类型,但是有些时候又不得不进行类型转换,那么就出现几种强转方式。1. 括号强转
- 问题是这样的在开发时,为了节约时间,我选择了mybatis框架来开发,然后又在网上找了一个许多人都推荐的mybatis-plus来作为持久层
- Android多媒体 MediaPlayer我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件,通过该类,我
- 目录一、数组、集合和 LINQ1、数组二、字符串内插三、模式匹配四、委托和 Lambda 表达式五、async/await六、属性一、数组、
- 前言:在java的网络通信中,两个不同节点的主机想要进行通信则可以通过建立Socket对象(相当于客户端主机,向服务端请求发送信息)和Ser
- C#操作注册表全攻略相信每个人对注册表并不陌生,在运行里面输入“regedit”就可以打开注册表编辑器了。这东西对Windows系统来说可是
- 前言Spring5带来了新的响应式web开发框架WebFlux,同时,也引入了新的HttpClient框架WebClient。WebClie
- 点击按钮返回顶部,直接上代码吧布局文件<LinearLayout xmlns:android="http://schemas
- (一).前言: 这两天QQ进行了重大更新(6.X)尤其在UI风格上面由之前的蓝色换成了白色居多了,侧滑效果也发生了一些变化,那我们今天来模仿
- 一、效果图二、代码public class TextSubView extends TextView {private TextPaint