Mybatis-Plus中的id生成策略

介绍

使用MP的id生成策略,我们需要使用到MP的一个注解叫@TableId

名称 @TableId
类型 属性注解
位置 模型类中用于表示主键的属性定义的上方
属性 value(默认):设置数据库表主键名称 type:设置主键属性的生成策略,值查照IdType的枚举值

idType的枚举类(各种生成策略)

@Getter
public enum IdType {
    
    
    /**
     * 数据库ID自增
     * <p>该类型请确保数据库设置了 ID自增 否则无效</p>
     */
    AUTO(0),
    /**
     * 该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
     */
    NONE(1),
    /**
     * 用户输入ID
     * <p>该类型可以通过自己注册自动填充插件进行填充</p>
     */
    INPUT(2),

    /* 以下2种类型、只有当插入对象ID 为空,才自动填充。 */
    /**
     * 分配ID (主键类型为number或string),
     * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)
     *
     * @since 3.3.0
     */
    ASSIGN_ID(3),
    /**
     * 分配UUID (主键类型为 string)
     * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(UUID.replace("-",""))
     */
    ASSIGN_UUID(4);

    private final int key;

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

idType 介绍
AUTO 需要在创建数据表的时候设置主键自增,否则失效
NONE 不设置id生成策略
INPUT 用户手动输入id
ASSIGN_ID 雪花算法生成id(可兼容数值型与字符串型)
ASSIGN_UUID 以UUID生成算法作为id生成策略

各种策略的对比:

NONE: 不设置id生成策略,MP不自动生成,约等于INPUT,所以这两种方式都需要用户手动设置,但是手动设置第一个问题是容易出现相同的ID造成主键冲突,为了保证主键不冲突就需要做很多判定,实现起来比较复杂
AUTO:数据库ID自增,这种策略适合在数据库服务器只有1台的情况下使用,不可作为分布式ID使用
ASSIGN_UUID:可以在分布式的情况下使用,而且能够保证唯一,但是生成的主键是32位的字符串,长度过长占用空间而且还不能排序,查询性能也慢
ASSIGN_ID:可以在分布式的情况下使用,生成的是Long类型的数字,可以排序性能也高,但是生成的策略和服务器时间有关,如果修改了系统时间就有可能导致出现重复主键

分布式中的ID

当数据量足够大的时候,一台数据库服务器存储不下,这个时候就需要多台数据库服务器进行存储。比如订单表就有可能被存储在不同的服务器上。如果用数据库表的自增主键,因为在两台服务器上所以会出现冲突。这个时候就需要一个全局唯一ID,这个ID就是分布式ID。

猜你喜欢

转载自blog.csdn.net/m0_51963973/article/details/129414182