mybatisplus 主键策略的几种实现方法-kb88凯时官网登录

时间:2024-10-18
阅读:
免费资源网,https://freexyz.cn/

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 主键策略的几种实现方法

雪花算法的原理就是生成一个的 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。算法中可通过记录最后一个生成 id 时的时间戳来解决,每次生成 id 之前比较当前服务器时钟是否被回拨,避免生成重复 id。

免费资源网,https://freexyz.cn/
返回顶部
顶部
网站地图