欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-09 23:03:39
目录mybatis-plus 可以通过@tableid注解指定主键生成策略看一下源码大概找一下雪花算法的实现方式自定义id生成器实现mybatis-plus 中生成雪花算法id的工具类mybatis-...

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就是雪花算法的实现类了。

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

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

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

如果想自己创建雪花算法手动创建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());
}

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