MyBatisPlus中向数据库表中插入数据,MyBatisPlus中使用@TableId注解来实现自增序列id自动插入的功能

文章目录

  • MyBatisPlus的@TableId注解来实现自增序列id自动插入的功能
    • 1、注解中type的值的含义
    • 2.type的值为AUTO
      • 雪花算法
    • 3.主键如果没有设置自增序列引发的一个异常

MyBatisPlus的@TableId注解来实现自增序列id自动插入的功能

这个注释主要用于对应数据库表的实体类中的主键属性。

写法:@TableId(value=“数据库主键字段”,type = IdType.六种类型之一)
例如:@TableId(value=“user_id”,type = IdType.AUTO )
IdType有很多属性,目前只需要弄清楚AUTO属性就行了,本例也是主要介绍的是AUTO属性的功能

1、注解中type的值的含义

    //IdType.ID_WORKER_STR 默认的;底层使用了雪花算法;类型为Integer
    //IdType.AUTO 数据库自增;数据库上也要勾上自增
    //IdType.NONE 没有设置主键类型;跟随全局;全局的主键策略如果没有设置,默认是雪花算法
    //IdType.INPUT 手动输入;必须手动输入,数据库自增也没用;
    //IdType.UUID 全局唯一id;无序;字符串;
    //ID_WORKER_STR 全局唯一(idWorker的字符串表示)

2.type的值为AUTO

在MyBatisPlus向数据库表中插入数据的时候,如果主键为id,并且在数据库的表中已经设置了id为自增列,如果在java实体的对应属性上面已经写了@Tableld(value=“id”,type=IdType.Auto)注解,那么插入数据的时候可以不写id的值,程序会按照自增规则给id补一个值插入数据库,但是如果没在java实体的id属性上写上注解@TableId(value=“id”,type=IdType.Auto),那么插入的时候虽然也会给id补一个值,但是却不是按照自增的规则而是按照雪花算法的规则。下图是设置java实体属性为自增:

MyBatisPlus中向数据库表中插入数据,MyBatisPlus中使用@TableId注解来实现自增序列id自动插入的功能_第1张图片

下图是设置数据库中对应的主键字段为自增:

MyBatisPlus中向数据库表中插入数据,MyBatisPlus中使用@TableId注解来实现自增序列id自动插入的功能_第2张图片

这样的话,插入的时候就不用设置id的值了,id的值会自动自增生成,如下图:

MyBatisPlus中向数据库表中插入数据,MyBatisPlus中使用@TableId注解来实现自增序列id自动插入的功能_第3张图片

如果仅仅是在数据库中的id字段上设置成了自增序列,但是却没有在javabean的对应的id属性上设置@Tableld(value=“id”,type=IdType.Auto)注解,这样的话id是按照雪花算法生成的。

雪花算法

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。

1、SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:

img

● 1位,不用。二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0

● 41位,用来记录时间戳(毫秒)。
○ 41位可以表示 2 41 − 1 2^{41}-1 2411个数字,
○ 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 2 41 − 1 2^{41}-1 2411,减1是因为可表示的数值范围是从0开始算的,而不是1。
○ 也就是说41位可以表示 2 41 − 1 2^{41}-1 2411个毫秒的值,转化成单位年则是 ( 2 41 − 1 ) / ( 1000 ∗ 60 ∗ 60 ∗ 24 ∗ 365 ) = 69 (2^{41}-1) / (1000 * 60 * 60 * 24 * 365) = 69 (2411)/(1000606024365)=69

10位,用来记录工作机器id。
○ 可以部署在 2 10 = 1024 2^{10} = 1024 210=1024个节点,包括 5位datacenterId 和 5位workerId
○ 5位(bit)可以表示的最大正整数是 2 5 − 1 = 31 2^{5}-1 = 31 251=31,即可以用0、1、2、3、…31这32个数字,来表示不同的datecenterId或workerId

12位,序列号,用来记录同毫秒内产生的不同id。
○ 12位(bit)可以表示的最大正整数是 2 12 − 1 = 4095 2^{12}-1 = 4095 2121=4095,即可以用0、1、2、3、…4094这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号

由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long来存储的。

SnowFlake可以保证:
● 所有生成的id按时间趋势递增
● 整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)

3.主键如果没有设置自增序列引发的一个异常

假设主键id没有设置成自增序列,但是插入用户的时候又没有设置id的值,那么会出现下图异常,如下图:

MyBatisPlus中向数据库表中插入数据,MyBatisPlus中使用@TableId注解来实现自增序列id自动插入的功能_第4张图片

给主键设置上自增序列异常就消失了,设置方法:

MyBatisPlus中向数据库表中插入数据,MyBatisPlus中使用@TableId注解来实现自增序列id自动插入的功能_第5张图片

你可能感兴趣的:(数据库表中的主键唯一生成,MyBatisPlus)