当前位置: 首页 > news >正文

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注解为实体类定义主键生成策略,例如:

@Entitypublic 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

http://www.lryc.cn/news/195040.html

相关文章:

  • Spring——和IoC相关的特性
  • 在 TensorFlow 中调试
  • 想要精通算法和SQL的成长之路 - 连续的子数组和
  • 【C++】头文件chrono
  • Python学习六
  • Springboot 集成 WebSocket
  • 谨以此篇,纪念我2023年曲折的计算机保研之路
  • VSS、VDD、VBAT、VSSA
  • 【Rust基础③】方法method、泛型与特征
  • 48.排列问题求解
  • 18.(开发工具篇Gitlab)Git如何回退到指定版本
  • IDEA初始配置
  • WM_COPYDATA传回返回值的一个方案
  • 【日常业务开发】接口性能优化
  • Android 10.0 禁止弹出系统simlock的锁卡弹窗功能实现
  • VulnHub lazysysadmin
  • ppt怎么压缩到10m以内?分享ppt缩小方法
  • 智能警用装备管理系统-科技赋能警务
  • 攻防千层饼
  • 组件封装使用?
  • 2.3 初探Hadoop世界
  • Flutter笔记:发布一个电商中文货币显示插件Money Display
  • 解密zkLogin:探索前沿的Sui身份验证解决方案
  • js构造函数
  • 性能测试-redis常见问题
  • 预测:2024 年将是互联网永远改变的一年。
  • Vue2 与 React 的区别
  • 【AI视野·今日Robot 机器人论文速览 第五十一期】Tue, 10 Oct 2023
  • 零经验想跳槽转行网络安全,需要准备什么?
  • Rust-是否使用Rc<T>