深入理解 `@TableId(type = IdType.AUTO)`:使用方法及其与其他主键生成策略的区别

在MyBatis-Plus(简称MP)中,@TableId 注解是用来标注实体类中主键的字段的,而 type = IdType.AUTO 是一个常见的配置选项,它指定了主键的生成策略。在实际开发中,如何配置主键生成策略对数据库的性能和稳定性有着重要影响。本文将深入探讨 @TableId(type = IdType.AUTO) 的使用方法,以及它与其他主键生成策略(如 IdType.INPUTIdType.UUID 等)的区别和适用场景。


一、什么是 @TableId 注解?

在 MyBatis-Plus 中,@TableId 注解用于指定实体类中的主键字段。通常情况下,主键字段需要具有唯一性,而且数据库会根据该字段的值来区分每一条记录。

@TableId(value = "id", type = IdType.AUTO)
private Long id;

在上面的代码中,@TableId 被用来标注 id 字段是表的主键。value 属性指定了数据库表中的字段名,而 type 属性指定了主键的生成策略。

二、@TableId(type = IdType.AUTO) 的使用方法

IdType.AUTO 表示主键由数据库自动生成,通常与自增长字段一起使用。这意味着,主键的值在插入时由数据库自增,而不是由程序代码显式指定。

常见的数据库支持:
  • MySQLAUTO_INCREMENT
  • PostgreSQLSERIAL
  • OracleSEQUENCE

代码示例

假设我们有一个实体类 User,我们希望在插入数据时由数据库自动生成主键:

@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO) // 自动生成主键private Long id;private String name;private Integer age;
}

对于上述实体类,当我们执行 userMapper.insert(user) 时,id 字段会被数据库自动填充(通常是自增长)。

三、与其他主键生成策略的区别

MyBatis-Plus 提供了多种主键生成策略,具体配置如下:

1. IdType.AUTO(数据库自增)

@TableId(type = IdType.AUTO) 配置表示主键由数据库自动生成。适用于支持自动增量字段的数据库,如 MySQL 的 AUTO_INCREMENT、PostgreSQL 的 SERIAL 等。

优点:

  • 简单易用,数据库自动处理主键。
  • 避免了手动生成主键的麻烦。

缺点:

  • 主键生成依赖数据库,某些数据库可能存在性能瓶颈(如高并发时自增主键可能引发争用问题)。
  • 对于分布式系统来说,可能需要额外的处理(如数据库分库分表时,可能会导致主键冲突或性能问题)。
2. IdType.INPUT(手动输入)

@TableId(type = IdType.INPUT) 配置表示主键由开发者手动输入,程序员需要在插入数据时显式指定主键值。

@TableId(type = IdType.INPUT)
private Long id;

优点:

  • 适合主键需要特定值的情况(如UUID或业务逻辑生成的主键)。
  • 适用于需要从外部系统传入主键的场景。

缺点:

  • 需要手动生成主键,增加了开发的复杂性和错误的风险。
  • 可能需要额外的处理来确保主键的唯一性,尤其是在分布式系统中。
3. IdType.UUID(UUID)

@TableId(type = IdType.UUID) 配置表示主键由 UUID(通用唯一识别码)生成。这是一个跨平台、全局唯一的标识符。

@TableId(type = IdType.UUID)
private String id;

优点:

  • 主键具有全局唯一性,适合分布式系统。
  • 不依赖数据库的自增长特性,避免了数据库主键生成的限制。

缺点:

  • UUID 是一串字符串,长度较长,可能导致数据库存储的空间浪费。
  • 在性能上可能不如自增主键,尤其是在大量数据插入时,UUID 生成和查询速度相对较慢。
4. IdType.ID_WORKER(雪花算法)

@TableId(type = IdType.ID_WORKER) 配置表示主键使用雪花算法生成。雪花算法是一种分布式ID生成算法,确保在分布式环境下每个服务生成的主键唯一且递增。

@TableId(type = IdType.ID_WORKER)
private Long id;

优点:

  • 生成的ID具有唯一性和有序性,适合分布式环境。
  • 雪花算法生成的ID为数字类型,性能较好。

缺点:

  • 雪花算法需要额外的配置和分布式协调。
  • 如果服务之间的时钟不一致,可能会产生主键重复的问题。
5. IdType.ASSIGN_UUID(分布式 UUID)

@TableId(type = IdType.ASSIGN_UUID) 配置表示主键为分布式的 UUID,通常与分布式系统搭配使用,确保不同节点生成的主键不会冲突。

@TableId(type = IdType.ASSIGN_UUID)
private String id;

优点:

  • 保证跨系统、跨机器的唯一性。
  • 在分布式系统中尤其有用。

缺点:

  • UUID 长度较长,可能会影响查询性能。
  • 不适合大量数据插入时的高效生成主键。

四、如何选择合适的主键生成策略?

选择合适的主键生成策略,通常取决于以下几个因素:

  • 单体应用或分布式系统:

    • 如果是单体应用,IdType.AUTO(数据库自增)通常是最简单、最有效的选择。
    • 如果是分布式系统,IdType.UUIDIdType.ID_WORKER 更适合,因为它们能确保不同节点生成的主键唯一。
  • 性能需求:

    • IdType.AUTO 在性能上可能会受到数据库锁机制的影响,在高并发场景下可能不如雪花算法(IdType.ID_WORKER)或 UUID(IdType.UUID)性能好。
  • 主键的唯一性:

    • 如果需要确保全局唯一,尤其是在分布式系统中,UUID 和雪花算法是更好的选择。
  • 业务需求:

    • 如果主键需要根据业务规则自定义,使用 IdType.INPUT 是最合适的。

五、总结

  • @TableId(type = IdType.AUTO) 适用于需要数据库自增的场景,简化了开发,但在分布式系统中可能带来一些挑战。
  • MyBatis-Plus 提供了多种主键生成策略(如 UUIDID_WORKERINPUT),开发者可以根据具体的应用场景来选择合适的策略。
  • 在选择主键生成策略时,需考虑系统的分布式架构、性能需求以及主键唯一性等多方面因素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安培环路定理

回忆 静电场中的回路定理:→静电场是保守场 安培环路定理 1、圆形回路包围无限长载流直导线 (1)回路逆时针 (2)回路顺时针 规定: 回路正向由右手螺旋定则判断(根据回路绕行方向,…

Locally Linear Embedding (LLE)

Locally Linear Embedding (LLE) Locally Linear Embedding (LLE) 是一种非线性降维算法,通常用于高维数据的流形学习。其核心思想是:假设数据点在局部是线性结构,通过保留每个数据点的局部线性结构关系,将数据嵌入到低维空间中。…

wsl配置ubuntu22.04,并配置docker

wsl配置ubuntu22.04,并配置docker 文章目录 wsl配置ubuntu22.04,并配置docker一、在Windows上安装Linux子系统前提条件安装步骤 二、wsl安装系统到其他盘①查看wsl运行状态,将其保持在关闭状态②导出当前Linux的镜像③注销之前的系统并检查④…

「QT」文件类 之 QDir 目录类

✨博客主页何曾参静谧的博客📌文章专栏「QT」QT5程序设计📚全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制…

expo5.2运行web报错Cannot find module ‘react‘

修改app.json中的web output 配置为 ‘single’ 可以解决 expo run web 这个错误问题 "web": {"bundler": "metro","output": "single","favicon": "./assets/images/favicon.png"},相关链接&#xff1…

Xcode 16 pod init失败的解决方案

目录 前言 一、错误重现 二、解决方案 1.右击项目修改文件展示方式 2.修改.xcodeproj文件 3.参考文档 前言 我们使用Xcode创建新项目之后,执行pod init报错。我们看一下如何解决。 一、错误重现 RuntimeError - PBXGroup attempted to initialize an object …

Mysql-DDL语句

文章目录 DDL 语句DDL 操作库创建数据库修改数据库使用数据库 DDL 操作表Mysql 的数据类型创建表修改表结构 🏡作者主页:点击! 🤖Mysql专栏:点击! ⏰️创作时间:2024年11月14日11点30分 DDL 语…

fastapi与tortoise配合对比django多数据源使用

在项目我们经常需要,多个数据库之间的数据交叉使用。在django中,可以在settings 文件中配置,比较简单,但是在fastapi 中如何解决呢 django 中使用方法: settings.py DATABASES {default: {ENGINE: django.db.backen…

css三角制作(二十课)

代码&#xff1a; <style>/* 边框原理 */.box1 {width: 0;height: 0;border-top: 100px solid pink;border-bottom: 100px solid blue;border-left: 100px solid yellow;border-right: 100px solid greenyellow;}/* 三角制作 */.box2 {width: 0;height: 0;border: 100px …

高效稳定!新加坡服务器托管方案助力企业全球化布局

在全球化的商业环境中&#xff0c;企业对于高效、稳定的服务器托管方案的需求日益迫切。作为亚洲的服务器托管中心&#xff0c;新加坡凭借其独特的地理位置、稳定的政治环境、先进的科技设施以及开放的市场政策&#xff0c;为企业提供了理想的服务器托管解决方案&#xff0c;助…

dapp获取钱包地址,及签名

npm install ethersimport {ethers} from ethers const accounts await ethereum.request({method: eth_requestAccounts}); // 获取钱包地址 this.form.address accounts[0] console.log("accounts:" this.address)const provider new ethers.BrowserProvider(…

【51单片机】LCD1602液晶显示屏

学习使用的开发板&#xff1a;STC89C52RC/LE52RC 编程软件&#xff1a;Keil5 烧录软件&#xff1a;stc-isp 开发板实图&#xff1a; 文章目录 LCD1602存储结构时序结构 编码 —— 显示字符、数字 LCD1602 LCD1602&#xff08;Liquid Crystal Display&#xff09;液晶显示屏是…

【Python · PyTorch】卷积神经网络(基础概念)

【Python PyTorch】卷积神经网络 CNN&#xff08;基础概念&#xff09; 0. 生物学相似性1. 概念1.1 定义1.2 优势1.2.1 权重共享1.2.2 局部连接1.2.3 层次结构 1.3 结构1.4 数据预处理1.4.1 标签编码① One-Hot编码 / 独热编码② Word Embedding / 词嵌入 1.4.2 归一化① Min-…

网络组以及网络组与网卡绑定应用场景的区别

网卡绑定在博主上一篇文章 “网络组”通常指的是一个逻辑上的网络分组&#xff0c;可以在不同的上下文中有不同的含义。根据不同的技术或场景&#xff0c;网络组的定义可能会有所不同。以下是几种常见的解释&#xff1a; 1. 虚拟局域网 (VLAN) 中的网络组 在网络管理中&…

Qt 之 qwt和QCustomplot对比

QWT&#xff08;Qt Widgets for Technical Applications&#xff09;和 QCustomPlot 都是用于在 Qt 应用程序中绘制图形和图表的第三方库。它们各有优缺点&#xff0c;适用于不同的场景。 以下是 QWT 和 QCustomPlot 的对比分析&#xff1a; 1. 功能丰富度 QWT 功能丰富&a…

谷歌DeepMind推出了一种新的方式来“窥探”AI的“内心”

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

蓝队知识浅谈(上)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;蓝队基础之网络七层杀伤链_哔哩哔哩_bilibili 本文主要分享一些蓝队相关的知识。 首先我们先来了解一下什么是蓝队&#xff1f; 蓝队是信息安全领…

PowerBI 用RANK,RANKX和TOPN 排名的简单示例

1. 销量表 2. 添加计算总销量的度量值&#xff0c;它将在RANK和RANKX里被使用 总销售量 SUM(销量[销售量]) 3.计算排名的度量值 RANK函数 排名 RANK(ALL(销量[产品]),ORDERBY([总销售量],DESC)) RANKX函数: 排名2 RANKX(ALL(销量),[总销售量],,DESC,Skip) 4.页面上添…

【EmbeddedGUI】脏矩阵设计说明

脏矩阵设计说明 背景介绍 一般情况下&#xff0c;当屏幕内容绘制完毕后&#xff0c;实际应用通常需要更新屏幕中的一部分内容&#xff0c;而不是单纯显示一个静态图片在那。 如下图所示&#xff0c;屏幕中有一个图片控件&#xff08;Img2&#xff09;和一个文本控件&#xf…

【蓝牙协议栈】【BLE】【IAS】蓝牙立即警报服务

蓝牙IAS协议&#xff08;Immediate Alert Service&#xff09;介绍 Immediate Alert Service&#xff08;IAS&#xff0c;立即警报服务&#xff09; 是蓝牙低功耗&#xff08;Bluetooth Low Energy, BLE&#xff09;中的一个标准服务&#xff0c;主要用于发出立即警报。它通常…