MybatisPlus 主键策略

MybatisPlus-Plus提供了多种主键生成策略,我们可以通过@TableId注解的 类型属性来设置主键id的增长策略,一共有几个多个主键策略,可根据情况自由配置。

主键策略

1、AUTO(自动增长策略)

AUTO自动增长策略,对于像MySQL这样的支持主键自动递增的数据库,我们可以使用IdType.AUTO策略。

@Data
public class UserInfo {
    //指定主键使用数据库ID自增策略
    @TableId(type = IdType.AUTO)
    private Integer id;
    private String userName;
    private String passWord;
}

2、INPUT(插入前自行设置主键值)

自定义输入策略:如果不想使用数据库的自增主键,也可以使用INPUT进行自己传递主键即可,进行插入工作,但在插入之前一定要检查数据库是否已经存在了该主键。

(1)针对有序列的数据库:Oracle,SQLServer等,当需要建立一个自增序列时,需要用到序列。

提示:
在Oracle 11g中,设置自增扩,需要先创建序列(SQUENCE)再创建一个触发器(TRIGGER)。
在Oracle 12c中,只需要使用IDENTITY属性就可以了,和MySQL一样简单。

(2)Mybatis-Plus已经定义好了常见的数据库主键序列,我们首先只需要在@Configuration类中定义好@Bean:Mybatis -Plus内置了如下数据库主键序列(如果内置支持不满足你的需求,可实现IKeyGenerator接口来进行扩展):

DB2KeyGenerator
H2KeyGenerator
KingbaseKeyGenerator
OracleKeyGenerator
PostgreKeyGenerator

(3)然后实体类配置主键 Sequence,指定主键策略为IdType.INPUT即可:

@Data
@KeySequence(value = "SEQ_ACL_ROLE" , clazz = Integer.class)
public class AclUser implements Serializable {
    private static final long serialVersionUID = 780903014942735924L;
    @TableId(value = "ID",type = IdType.INPUT)
    private Integer id;

3、ASSING_ID(雪花算法)

如果不设置类型值,默认则使用IdType.ASSIGN_ID策略(自3.3.0起)。该策略会使用雪花算法自动生成主键ID,主键类型为Long或String(分别对应的MySQL的表字段为BIGINT和VARCHAR)

雪花算法(SnowFlake)是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的。

@Data
public class UserInfo {
    //指定主键生成策略使用雪花算法(默认策略)
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String userName;
    private String passWord;
}

4、ASSING_UUID(不含中划线的UUID)

如果使用IdType.ASSIGN_UUID策略,并重新自动生成排除中划线的UUID作为主键。主键类型为String,对应MySQL的表分段为VARCHAR(32)

@Data
public class UserInfo {
    //指定主键生成策略为不含中划线的UUID
    @TableId(type = IdType.ASSIGN_UUID)
    private String id;
    private String userName;
    private String passWord;
}

5、NONE(无状态)

如果使用 IdType.NONE 策略,表示未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)

雪花算法

算法介绍

MybatisPlus 主键策略_第1张图片

雪花算法的原理就是生成一个的 64 位比特位的 long 类型的唯一 id。

1.最高 1 位固定值 0,因为生成的 id 是正整数,如果是 1 就是负数了。
2.接下来 41 位存储毫秒级时间戳,2^41/(1000*60*60*24*365)=69,大概可以使用 69 年。
3.再接下 10 位存储机器码,包括 5 位 datacenterId 和 5 位 workerId。最多可以部署 2^10=1024 台机器。
4.最后 12 位存储序列号。同一毫秒时间戳时,通过这个递增的序列号来区分。即对于同一台机器而言,同一毫秒时间戳下,可以生成 2^12=4096 个不重复 id。

可以将雪花算法作为一个单独的服务进行部署,然后需要全局唯一 id 的系统,请求雪花算法服务获取id 即可。

对于每一个雪花算法服务,需要先指定 10 位的机器码,这个根据自身业务进行设定即可。例如机房号+机器号,机器号+服务号,或者是其他可区别标识的 10 位比特位的整数值都行。

算法优缺点

优点:

  1. 高并发分布式环境下生成不重复 id,每秒可生成百万个不重复 id。

  1. 基于时间戳,以及同一时间戳下序列号自增,基本保证 id 有序递增。

  1. 不依赖第三方库或者中间件。

  1. 算法简单,在内存中进行,效率高。

缺点:

依赖服务器时间,服务器时钟回拨时可能会生成重复 id。算法中可通过记录最后一个生成 id 时的时间戳来解决,每次生成 id 之前比较当前服务器时钟是否被回拨,避免生成重复 id。

你可能感兴趣的:(mybatis,java,spring,boot)