MyBatis-Plus主键生成策略[MyBatis-Plus系列] - 第491篇
历史文章(文章累计490+)
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
表名注解/主键注解/字段注解/乐观锁注解[MyBatis-Plus系列] - 第486篇
MyBatis-Plus通用Service快速实现赠三改查[MyBatis-Plus系列] - 第489篇
SpringBoot集成MyBatis-Plus + MyBatis-Plus代码生成器[MP系列] - 第490篇
悟纤:师傅,你说人为什么拥有的时候不珍惜,而是等失去了才珍惜呢?
师傅:就像你养了一只可爱的小猫咪,你只享受着它带给你的温柔和可爱,却不知道珍惜它照顾它,直到有一天,小猫咪病倒了,最后抢救无效小猫咪永远地离开了你,这时候你才想去珍惜却已经晚了,你很懊悔也很伤心,责备自己为什么在猫咪活着的时候没有珍惜它照顾好它。
师傅:在现实中的伴侣也是如此,拥有的时候不知道去珍惜,各种作......直到失去后,抓心挠肝的悔不当初,甚至用头哐哐的撞大墙。
师傅:因为你知道她/他不会离开你,你却一直挑战他/她的底线。最后终于失去才后悔莫及。
悟纤:那师傅我们可以做什么?
师傅:任何时候都应该懂得感恩,懂得回报,懂得珍惜 。
悟纤:师傅,我懂了,要时刻有一颗感恩的心,不要把对方对你的好认为是理所当然。
师傅:是这个道理,但做起来很难。时刻去内观自己的心境,提高自己的情绪管理能力,不要情绪把情绪发泄给对方,等等。相处之道本就是一门很大的学门。
悟纤:徒儿受益匪浅,还是要强大自己,才能够去保护自己想保护的。
导读
Hi,大家好,我是悟纤。过着爱谁谁的生活,活出不设限的人生。
Mybatis Plus 为我们提供了三种设置主键生成策略的方式。它们的优先级顺序是:局部注解 > 全局 > 默认(雪花算法),下面我们来一一介绍。
一、常用的主键生成策略
主键生成策略是指在数据库中为每条记录生成唯一标识符的方法。常用的主键生成策略有以下几种:
(1)自增长(自动编号):每添加一条记录,自动加1;优点是能够保证主键唯一,缺点是无法在分布式系统中实现。
(2)UUID/GUID:采用随机算法生成的字符串,理论上能够保证不重复,但主键长度较长,不便于存储和索引。
(3)分布式ID生成器:采用雪花算法、UID、美团Leaf等算法生成的主键,能够在分布式系统中实现全局唯一,且主键长度较短,但实现略复杂。
(4)数据库序列(Sequence):一种由数据库提供的生成主键的方法,能够保证主键唯一,但无法在分布式系统中实现。
(5)组合主键:将多个字段组合成一个主键,能够保证唯一性,但可能存在冗余数据和空值。
二、Java中的主键生成策略
在Java中,给实体类定义主键时一般需要指定主键生成策略,常用的主键生成策略有以下几种:
(1)自增长策略(GenerationType.IDENTITY) 这种策略是指数据库自动为每一行添加一个唯一的标识列,并且在插入数据时自动递增。在MySQL中,可以使用AUTO_INCREMENT关键字来定义自增长列。
(2)序列策略(GenerationType.SEQUENCE) 序列策略是指使用数据库中的序列生成主键,序列是一种特殊的对象,可以自动创建一组连续的数字。在Oracle中,可以使用CREATE SEQUENCE语句来定义序列。
(3)表策略(GenerationType.TABLE) 表策略是指在数据库中定义一个专门用于生成主键的表,包含了一个主键字段和一个取值字段。在插入数据时,先从这个表中获取一个值作为主键,并且同时更新取值字段的值,确保每个主键都是唯一的。
(4)UUID策略(GenerationType.UUID) UUID策略是指使用Java中的UUID来生成主键,UUID是一种通用唯一标识符,可以作为主键使用。
在JPA中,可以通过@Entity注解为实体类定义主键生成策略,例如:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // 指定自增长策略
private Long id;
...
}
三、局部和全局设置主键生成策略
在MP中,如何配置主键的生成策略呢?主要有两种方式:局部配置和全局配置。
3.1 局部设置
局部的配置方式直接在主键字段上添加@TableId的注解,并且通过type来设置生成策略:
@TableId(type = IdType.ASSIGN_ID)
private Long id;
3.2 全局设置
全局设置的方式只需要在配置文件application.properties(yml)中进行配置:
mybatis-plus.global-config.db-config.id-type=assign_id
四、IdType取值
值 | 描述 |
AUTO | 数据库 ID 自增 |
NONE | 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT) |
INPUT | insert 前自行 set 主键值 |
ASSIGN_ID | 分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法) |
ASSIGN_UUID | 分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法) |
ID_WORKER | 分布式全局唯一 ID 长整型类型(please use ASSIGN_ID) |
UUID | 32 位 UUID 字符串(please use ASSIGN_UUID) |
ID_WORKER_STR | 分布式全局唯一 ID 字符串类型(please use ASSIGN_ID) |
特别说明:
(1)如果设置类型是AUTO自增策略,数据库字段一定设置自增。
(2)在没有进行设置主键生成算法的时候,默认算法是雪花算法。
雪花算法是一种用于生成全局唯一ID的算法,它的全名为雪花ID算法(Snowflake ID Algorithm)。该算法产生的ID是一个64位的整型数,由三部分组成:时间戳 + 机器ID + 序列号。其中,时间戳占41位,可以精确到毫秒级别;机器ID占10位,可以支持1024台机器;序列号占12位,可以支持每台机器每毫秒产生4096个ID。因此,雪花算法可以在分布式系统中生成唯一的ID,保证ID的唯一性和有序性,同时也支持高并发的ID生成需求。
小结
本文主要介绍了MP的主键生成策略,在实际项目常见的是:
(1)AUTO:数据库 ID 自增。
(2)ASSIGN_ID:使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)。
(3)雪花算法:雪花算法是一种用于生成全局唯一ID的算法,它的全名为雪花ID算法(Snowflake ID Algorithm)。该算法产生的ID是一个64位的整型数,由三部分组成:时间戳 + 机器ID + 序列号。其中,时间戳占41位,可以精确到毫秒级别;机器ID占10位,可以支持1024台机器;序列号占12位,可以支持每台机器每毫秒产生4096个ID。因此,雪花算法可以在分布式系统中生成唯一的ID,保证ID的唯一性和有序性,同时也支持高并发的ID生成需求。
点赞、转发、评论,伸出你的双手666…
你就是你,不一样的小蚂蚁!
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
à悟纤学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
ShardingJDBC分库分表:http://t.cn/A6ZarrqS
分布式事务解决方案:http://t.cn/A6ZaBnIr
JVM内存模型调优实战:http://t.cn/A6wWMVqG
Spring入门到精通:https://t.cn/A6bFcDh4
大话设计模式之爱你:https://dwz.cn/wqO0MAy7