java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MybatisPlus 主键策略

MybatisPlus 主键策略的几种实现方法

作者:伍拾贰i

MybatisPlus-Plus支持多种主键生成策略,可以通过@TableId注解的type属性配置,主要策略包括AUTO、INPUT、ASSING_ID、ASSING_UUID和NONE,每种策略适用于不同的场景,下面就来介绍一下

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)

雪花算法

算法介绍

雪花算法的原理就是生成一个的 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 位比特位的整数值都行。

算法优缺点

优点:

缺点:

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

到此这篇关于MybatisPlus 主键策略的几种实现方法的文章就介绍到这了,更多相关MybatisPlus 主键策略内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文