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