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

您所在的位置:网站首页 id是怎么设置的 MyBatisPlus中向数据库表中插入数据,MyBatisPlus中使用@TableId注解来实现自增序列id自动插入的功能

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

2024-07-17 21:32| 来源: 网络整理| 查看: 265

文章目录 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实体属性为自增:

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

如果仅仅是在数据库中的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 241−1个数字, ○ 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 2 41 − 1 2^{41}-1 241−1,减1是因为可表示的数值范围是从0开始算的,而不是1。 ○ 也就是说41位可以表示 2 41 − 1 2^{41}-1 241−1个毫秒的值,转化成单位年则是 ( 2 41 − 1 ) / ( 1000 ∗ 60 ∗ 60 ∗ 24 ∗ 365 ) = 69 (2^{41}-1) / (1000 * 60 * 60 * 24 * 365) = 69 (241−1)/(1000∗60∗60∗24∗365)=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 25−1=31,即可以用0、1、2、3、…31这32个数字,来表示不同的datecenterId或workerId

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

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

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

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

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

在这里插入图片描述

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

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3