Mybatis Plus自定义主键生成策略

Mybatis Plus自定义主键生成策略

前景提要

Mybatis Pro的主键策略定义

public enum IdType {
    AUTO(0),  //数据库自增 依赖数据库
    NONE(1),  // 表示该类型未甚至主键类型 (如果没有主键策略)默认根据雪花算法生成
    INPUT(2),  //用户输入ID(该类型可以通过自己注册填充插件进行填充)
    ASSIGN_ID(3), 
    //雪花算法(SnowFlake)是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的
    ASSIGN_UUID(4),  //不含中划线的UUID
    /** @deprecated */
    @Deprecated
    ID_WORKER(3),  //全局唯一(idWorker)数值类型
    /** @deprecated */
    @Deprecated
    ID_WORKER_STR(3),  //全局唯一(idWorker的字符串表示)
    /** @deprecated */
    @Deprecated
    UUID(4);  //全局唯一(UUID)

    private final int key;

    private IdType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}

Mybatis plus主键生成策略方法

方法 主键生成策略 主键类型 说明
nextId ASSIGN_ID,ID_WORKERID_WORKER_STR Long,Integer,String 支持自动转换为String类型,但数值类型不支持自动转换,需精准匹配,例如返回Long,实体主键就不支持定义为Integer
nextUUID ASSIGN_UUID,UUID String 默认不含中划线的UUID生成

官网的指导文件提供了三种配置方式:

Spring-Boot

#方式一:声明为Bean供Spring扫描注入
@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;
    }
}
#方式二:使用配置类
@Bean
public IdentifierGenerator idGenerator() {
    return new CustomIdGenerator();
}
#方式三:通过MybatisPlusPropertiesCustomizer自定义
@Bean
public MybatisPlusPropertiesCustomizer plusPropertiesCustomizer() {
    return plusProperties -> plusProperties.getGlobalConfig().setIdentifierGenerator(new CustomIdGenerator());
}

需求:生成String类型的ID

数据库 ID 字段: vachar(18) user_id

实体类注解配置:
@TableId(value = "user_id", type = IdType.ASSIGN_UUID)
    private String userId;
主键生成策略采用第二种方式(配置类)配置:
/**
     * 自定义ID生成策略
     * @return
     */
    @Bean
    public IdentifierGenerator getIdentifierGenerator(){
        return new IdentifierGenerator() {

            @Override
            public Number nextId(Object entity) {
                return null;
            }

            @Override
            public String nextUUID(Object entity) {
                return IDuitl.getCustomId();
            }
        };

       // getCustomId方法
        private String getCustomId(){
            String time = String.valueOf(System.currentTimeMillis());
            return "LAN" + time;
        }
    }

End.


标题: Mybatis Plus自定义主键生成策略
文章作者: lonuslan
文章链接: https://louislan.com/articles/2021/08/31/1630380388794.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hi I'm LouisLan
    评论
    0 评论
avatar

取消