mybatis-plus 如何使用雪花算法ID生成策略

目录
  • mybatis-plus 可以通过@TableId注解指定主键生成策略
    • 看一下源码大概找一下雪花算法的实现方式
    • 自定义ID生成器实现
  • 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());
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis-Plus雪花id的使用以及解析机器ID和数据标识ID实现

    概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成. 而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务. 结构 snowflake的结构如下(每部分用

  • mybatis-plus主键生成策略

    MP 支持多种主键策略 默认是推特的"" 雪花算法"" ,也可以设置其他策略下面我演示主键策略使用 MP的主键定义在一个一个枚举类中 源码如下 public enum IdType { AUTO(0),//数据库自增 依赖数据库 NONE(1),// 表示该类型未甚至主键类型 (如果没有主键策略)默认根据雪花算法生成 INPUT(2),//用户输入ID(该类型可以通过自己注册填充插件进行填充) //下面这三种类型,只有当插入对象id为空时 才会自动填充. ID_WO

  • mybatis-plus雪花算法自动生成机器id原理及源码

    1.雪花算法原理 雪花算法使用一个 64 bit 的 long 型的数字作为全局唯一 id.这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号. 1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数.生成的id一般都是用整数,所以最高位固定为0. 41bit-时间戳,用来记录时间戳,毫秒级. 10bit-工作机器id,用来记录工作机器id. 12bit-序列号,序列号,用来

  • Mybatisplus主键生成策略算法解析

    mybatisplus支持多种主键生成策略,默认采用认 ID_WORKER 即雪花算法 雪花算法 snowflflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID.其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0.可以保证几乎全球唯一! mybatisplus默认主键生成策略有可能会和我们的数据库

  • mybatis-plus 如何使用雪花算法ID生成策略

    目录 mybatis-plus 可以通过@TableId注解指定主键生成策略 看一下源码大概找一下雪花算法的实现方式 自定义ID生成器实现 Mybatis-plus 中生成雪花算法id的工具类 mybatis-plus 可以通过@TableId注解指定主键生成策略 @TableId(value="id",type=IdType.ASSIGN_ID) 值 描述 AUTO 数据库ID自增 NONE 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) INPUT

  • 一种简单的ID生成策略: Mysql表生成全局唯一ID的实现

    生成全局ID的方法很多, 这里记录下一种简单的方案: 利用mysql的自增id生成全局唯一ID. 1. 创建一张只需要两个字段的表: CREATE TABLE `guid` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `stub` char(1) NOT NULL DEFAULT '' COMMENT '桩字段,占坑的', PRIMARY KEY (`id`), UNIQUE KEY `uk_stub` (`stub`) -- 将 st

  • Mybatis-plus全局id生成策略详解

    Mybatis-plus全局id生成策略 在配置文件中加入以下代码后就不需要在实体类种的id上添加 @TableId(value = "id", type = IdType.AUTO) mybatis-plus:   global-config:     db-config:       id-type: auto #设置主键自动生成策略(全局id生成策略) Mybatis-plus6种主键生成策略小结 /** * 数据库ID自增,数据库需要支持主键自增(如MySQL),并设置主键自增

  • mybatis-plus雪花算法生成Id使用详解

    目录 前言 一.mybatis-plus官网 二.雪花算法实战 三.实现分析 四.为什么默认就是雪花算法 五.主动设置Id生成策略 总结 前言 在实际开发过程中,数据库自增主键生成Id能满足大部分的场景.但是随着分布式应用场景的增多,表数据的增大导致分表分库的大量应用.数据库自增主键的生成规则无法满足对应的业务场景,于是诞生了越来越多的分布式ID生成算法,其中雪花算法是目前最为流行的.今天说一下在mybatis-plus中如何使用雪花算法生成Id. 一.mybatis-plus官网 官方文档:h

  • SpringBoot雪花算法主键ID传到前端后精度丢失问题的解决

    目录 简介 问题描述 项目场景 问题描述 问题复现 解决方案 法1:全局处理 法2:局部处理 简介 本文用示例介绍SpringBoot如何解决雪花算法主键ID传到前端后精度丢失问题. 问题描述 Java后端Long类型的范围 -2^63~2^63,即:-9223372036854775808~9223372036854775807,它是19位的. 这个数字可以通过方法获得:Long.MAX_VALUE.Long_MIN_VALUE. 前端JS的数字类型的范围 -2^53~2^53,即:-9007

  • Java实现雪花算法(snowflake)

    本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序.注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) 后得到的值,这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序SnowFlake类的START_STMP属性).41位的时间截

  • mybatis-plus雪花算法增强idworker的实现

    目录 一.官网 二.默认实现的弊端 三.mybatis-plus中datacenterId和workerId的默认生成规则 四.idworker介绍 五.idworker实战 总结 一.官网 官方文档:https://baomidou.com/ Git地址:https://github.com/baomidou/mybatis-plus idworker官网:https://github.com/imadcn/idworker TIP️:推荐学习框架的时候,多研究下官网,获取第一手资料. 二.默

  • Mybatis-Plus主键生成策略的方法

    目录 前言 一.官网 二.主键注解@TableId说明 1.源码 2.作用 3.使用 三.主键生成策略-IdType枚举说明 1.源码 2.说明 3.全局设置 三.ID生成器介绍 1.IdentifierGenerator 2.IKeyGenerator 四.自定义主键生成器 总结 前言 很多人在使用Mybatis-Plus的时候可能会疑惑,自己明明没有配置主键的生成策略,但是执行新增操作时却自动生成了主键,而且还特别长.这是由于Mybatis-Plus默认就会采用雪花算法填充主键字段. 今天就

  • Java 基于雪花算法生成分布式id

    SnowFlake算法原理介绍 在分布式系统中会将一个业务的系统部署到多台服务器上,用户随机访问其中一台,而之所以引入分布式系统就是为了让整个系统能够承载更大的访问量.诸如订单号这些我们需要它是全局唯一的,同时我们基本上都会将它作为查询条件:出于系统安全考虑不应当让其它人轻易的就猜出我们的订单号,同时也要防止公司的竞争对手直接通过订单号猜测出公司业务体量:为了保证系统的快速响应那么生成算法不能太耗时.而雪花算法正好解决了这些问题. SnowFlake 算法(雪花算法), 是Twitter开源的分

随机推荐