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

MyBatis Plus中的@TableId注解

@TableId 注解用于将某个成员变量指定为数据表主键,以下为使用示例:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("user")
public class User {@TableId(value = "id")private Integer id;@TableField(value = "name")private String name;
}

下面将介绍 @TableId 注解的属性:

1、value 

该属性用于指定数据表主键字段名称,不是必填的,默认为空字符串。上述示例中,将User中的id字段标识为主键,并且对应数据表中的id字段。

2、type

该属性用于指定数据库表主键类型,如:ID自增、UUID等。该属性的值是一个IdType枚举类型,默认为IdType.NONE。

提前构建单元测试,以下所有示例场景全部通用,如下所示

@Test
public void test(){User user =new User();user.setName("赵六");userMapper.insert(user);
}

2.1 NONE

该类型为 type 属性的默认主键类型,当我们设置@TableId类型为NONE时,且不手动设置主键值,MyBatis Plus将默认给出一个Long类型的数字或字符串(根据主键数据类型变化)。

以下为数据库表主键自增,业务代码未设置主键值: 

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(10) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user` (`id`, `name`) values('1','张三');
insert into `user` (`id`, `name`) values('2','李四');
insert into `user` (`id`, `name`) values('3','王五');

执行单元测试,输出日志如下,其中1197658113就是 MyBatis Plus 自动设置的值: 

==>  Preparing: INSERT INTO user ( id, name ) VALUES ( ?, ? )
==> Parameters: 1197658113(Integer), 赵六(String)
<==    Updates: 1

另外当数据库表未设置主键自增,业务代码未设置主键值时,其执行情况和上述情形一样,都是给出一个Long类型的数字或字符串。 

2.2 AUTO

特别说明:这种ID生成策略是使用数据库ID自增,在使用该策略的时候一定要确保对应的数据表设置了ID主键自增,否则无效。 

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("user")
public class User {@TableId(value = "id", type = IdType.AUTO)private Integer id;@TableField(value = "name")private String name;
}

以下为数据库表未设置主键自增,业务代码未设置主键值:  

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` INT(11) NOT NULL,`name` VARCHAR(10) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `user` (`id`, `name`) VALUES('1','张三');
INSERT INTO `user` (`id`, `name`) VALUES('2','李四');
INSERT INTO `user` (`id`, `name`) VALUES('3','王五');

执行单元测试,输出日志会报错,如下所示: 

### The error occurred while setting parameters
### SQL: INSERT INTO user  ( name )  VALUES  ( ? )
### Cause: java.sql.SQLException: Field 'id' doesn't have a default value
; Field 'id' doesn't have a default value; nested exception is java.sql.SQLException: Field 'id' doesn't have a default value

以下为数据库表设置了主键自增,业务代码未设置主键值:   

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` INT(11) NOT NULL,`name` VARCHAR(10) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `user` (`id`, `name`) VALUES('1','张三');
INSERT INTO `user` (`id`, `name`) VALUES('2','李四');
INSERT INTO `user` (`id`, `name`) VALUES('3','王五');

执行单元测试,输出日志如下所示(查看数据库表中数据,主键ID正常递增,符合预期):  

==>  Preparing: INSERT INTO user ( name ) VALUES ( ? )
==> Parameters: 赵六(String)
<==    Updates: 1

2.3 INPUT

特别说明:这种ID生成策略,需要将表的自增策略删除掉,侧重点在于由使用者自己设置。如果没有设置主键ID的值,则会报错,错误提示就是主键ID没有给值;如果设置了主键ID,则数据就能添加成功。 

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("user")
public class User {@TableId(value = "id", type = IdType.INPUT)private Integer id;@TableField(value = "name")private String name;
}

以下为数据库表未设置主键自增,业务代码未设置主键值: 

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` INT(11) NOT NULL,`name` VARCHAR(10) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO `user` (`id`, `name`) VALUES('1','张三');
INSERT INTO `user` (`id`, `name`) VALUES('2','李四');
INSERT INTO `user` (`id`, `name`) VALUES('3','王五');

执行单元测试,输出日志会报错,如下所示:  

### The error occurred while setting parameters
### SQL: INSERT INTO user  ( id, name )  VALUES  ( ?, ? )
### Cause: java.sql.SQLIntegrityConstraintViolationException: Column 'id' cannot be null
; Column 'id' cannot be null; nested exception is java.sql.SQLIntegrityConstraintViolationException: Column 'id' cannot be null

以下为数据库表设置了主键自增,业务代码未设置主键值:  

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(10) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user` (`id`, `name`) values('1','张三');
insert into `user` (`id`, `name`) values('2','李四');
insert into `user` (`id`, `name`) values('3','王五');

执行单元测试,输出日志如下所示:   

==>  Preparing: INSERT INTO user ( id, name ) VALUES ( ?, ? )
==> Parameters: null, 赵六(String)
<==    Updates: 1

从上面可以日志得知,当我们没有设置主键id值时,MyBatis Plus也不会主动设置该字段的值。但是由于数据库中表定义了主键ID递增,所以还是会执行成功。

2.4 ASSIGN_ID

ASSIGN_ID表示分配ID,要求其主键类型为数字或者字符串,使用接口 IdentifierGeneratornextId 方法(默认实现类为 DefaultIdentifierGenerator 雪花算法)。 

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("user")
public class User {@TableId(value = "id", type = IdType.ASSIGN_ID)private Integer id;@TableField(value = "name")private String name;
}

执行单元测试,输出日志如下所示:    

==>  Preparing: INSERT INTO user ( id, name ) VALUES ( ?, ? )
==> Parameters: 690143233(Integer), 赵六(String)
<==    Updates: 1

上面日志中的id字段的值“690143233”是通过调用 DefaultIdentifierGenerator 的 nextId 方法获取。 

2.5 ASSIGN_UUID

ASSIGN_UUID表示分配UUID,适用于主键类型为String,使用接口 IdentifierGenerator 的 nextUUID 方法。

构建数据库中user表的数据结构: 

CREATE TABLE `user` (`id` varchar(256) NOT NULL,`name` varchar(10) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

构建对应的实体类:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("user")
public class User {@TableId(value = "id", type = IdType.ASSIGN_UUID)private String id;@TableField(value = "name")private String name;
}

执行单元测试,输出日志如下所示:   

==>  Preparing: INSERT INTO user ( id, name ) VALUES ( ?, ? )
==> Parameters: 2aa75775d5217f16c4605e9e5074eea1(String), 赵六(String)
<==    Updates: 1

上面日志中的“2aa75775d5217f16c4605e9e5074eea1”用户ID是通过IdentifierGenerator的nextUUID方法获得。 

相关文章:

MyBatis Plus中的@TableId注解

TableId 注解用于将某个成员变量指定为数据表主键&#xff0c;以下为使用示例&#xff1a; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lo…...

java基础概念33:常见API-Objects工具类

一、使用场景 二、成员方法 2-1、equals方法 源码&#xff1a; 2-2、isNull方法、nonNull方法 三、小结...

脚手架vue-cli,webpack模板

先安装node.js&#xff0c;它是服务器端&#xff0c;用于给页面提供服务。前端学习不需要会node.js&#xff0c;只需要学会node.js衍生出来的npm命令即可。 npm 是node.js的一个工具&#xff0c;作用是进行包管理&#xff0c;npm是node.js的包管理器。 接着安装脚手架&#xff…...

什么是React Native?

写在前面 React Native (RN) 是一个由 Facebook 开发的开源框架&#xff0c;用于构建跨平台的移动应用程序。它允许开发者使用 JavaScript 和 React 来创建原生 iOS 和 Android 应用。RN 的出现极大地简化了移动应用的开发过程&#xff0c;使得开发者可以更快速、更高效地构建…...

Three.js LOD(Level of Detail)通过根据视距调整渲染细节的技术

在 Three.js 中&#xff0c;LOD&#xff08;Level of Detail&#xff09;技术是一种通过根据视距调整渲染细节的技术&#xff0c;旨在提高渲染性能并优化用户体验。LOD 技术尤其在处理复杂场景或高多边形模型时显得尤为重要。在这篇博客中&#xff0c;我们将详细介绍 LOD 的概念…...

Vulnhub靶场案例渗透[12]-Grotesque: 1.0.1

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 目录扫描4. 敏感信息获取5. 反弹shell6. 权限提升 一、靶场搭建 1. 靶场描述 get flags difficulty: medium about vm: tested and exported from vi…...

招聘和面试

本篇内容是根据2019年4月份#82 Hiring and job interviews音频录制内容的整理与翻译 小组成员 Mat Ryer、Ashley McNamara、Johnny Boursiquot 和 Carmen Andoh 讨论了受聘、雇用和工作面试的过程。如果人是团队中最重要的部分&#xff0c;我们如何选择与谁一起工作&#xff1…...

Gin 框架入门(GO)-1

解决安装包失败问题(*) go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct 1 介绍 Gin 是一个 Go (Golang) 编写的轻量级 http web 框架,运行速度非常快,Gin 最擅长的就是 Api 接口的高并发。 2 Gin 环境搭建 1.下载并安装 gin go get -u github.…...

LeetCode:700. 二叉搜索树中的搜索

目录 题目描述: 代码: 题目描述: 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,1,3…...

用邻接矩阵实现图的深度优先遍历

问题描述 给定一个无向图&#xff0c;用邻接矩阵作为图的存储结构&#xff0c;输出指定顶点出发的深度优先遍历序列。在深度优先遍历的过程中&#xff0c;如果同时出现多个待访问的顶点&#xff0c;则优先选择编号最小的一个进行访问。 输入描述 第一行输入三个正整数&#…...

vue2中实现token的无感刷新

后端配置 设置Token过期时间&#xff1a;在后端&#xff08;如服务器或网关&#xff09;配置access_token和refresh_token的过期时间。通常&#xff0c;access_token的过期时间较短&#xff0c;而refresh_token的过期时间较长。提供刷新Token接口&#xff1a;后端需要提供一个…...

无需Photoshop即可在线裁剪和调整图像大小的工具

Bitmind是一个灵活且易于使用的批量图像本地化处理器&#xff0c;经过抓包看&#xff0c;这个工具在浏览器本地运行&#xff0c;不会上传图片到服务器&#xff0c;所以安全性完全有保证。 它可以将图像调整到任何特定尺寸&#xff0c;并在必要时按比例裁剪。 这是一个在线工具…...

云安全之法律和合规

0x00 前言 本文主要内容是从法律&#xff0c;合同&#xff0c;电子举证&#xff0c;以及合规和审计这五个部分来记录一下相关的云安全内容 0x01 法律 受法律约束的影响因素 云服务所在的地区云用户所在的区域数据主体所在的区域 GDPR&#xff1a;通用数据保护法案&#xf…...

倒计时功能分享

今天想要分享的是一个面试题&#xff0c;也是一个我们在项目中常用的功能&#xff1a;倒计时。 首先我们在写倒计时的时候必须要考虑到是&#xff1a;准确性、性能。接下来我们一步一步实现这个完美地倒计时功能。 setInterval 先来简单实现一个倒计时的函数&#xff1a; func…...

【论文分享】使用多源数据识别建筑功能:以中国三大城市群为例

建筑功能对城市规划至关重要&#xff0c;而利用多源数据进行建筑功能分类有助于支持城市规划政策。本研究通过分析建筑特征和POI密度&#xff0c;识别了中国三个城市群的建筑功能&#xff0c;并使用XGBoost模型验证了其在大规模映射中的高准确性和有效性。研究强调了建筑环境对…...

华为手机启用ADB无线调试功能

打开开发者模式,勾选USB调试,和“仅充电”模式下允许ADB调试 确认 设置添加adb路径到PATH变量 使用adb查看安卓设置 切换为无线模式: 查看手机IP...

云原生之Kubernetes集群搭建

1、Kubernetets基础概念 传统的服务器架构演进,现在基于docker容器化应用可以完成快速部署,但是对于大型的应用,有可能出现成百上千个容器化应用,一个挂了需要人工管理是相当麻烦,因此急需一个大规模容器编排系统。 Kubernetes Kubernetes 是一个可移植、可扩展的开源平…...

STM32单片机CAN总线汽车线路通断检测

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展&#xff0c;车辆通信接口在汽车电子控…...

大连理工大学概率上机作业免费下载

大连理工大学概率论与数理统计上机资源 本资源库收录了大连理工大学概率论与数理统计课程的上机作业范例代码&#xff0c;旨在通过实际操作加深学生对概率统计概念的理解&#xff0c;帮助学生更好地理解和掌握知识点。 作业内容概览 第一题&#xff1a;随机变量关系探索 数…...

Tomcat 如何管理 Session

Tomcat 如何管理 Session 我们知道&#xff0c;Tomcat 中每一个 Context 容器对应一个 Web 应用&#xff0c;而 Web 应用之间的 Session 应该是独立的&#xff0c;因此 Session 的管理肯定是 Context 级的&#xff0c;也就是一个 Context 一定关联多个 Session。 Tomcat 中主…...

终极指南:5分钟掌握TegraRcmGUI Switch注入工具的核心能力

终极指南&#xff1a;5分钟掌握TegraRcmGUI Switch注入工具的核心能力 【免费下载链接】TegraRcmGUI C GUI for TegraRcmSmash (Fuse Gele exploit for Nintendo Switch) 项目地址: https://gitcode.com/gh_mirrors/te/TegraRcmGUI TegraRcmGUI是一款专为Nintendo Switc…...

高光谱分类别只盯着精度?聊聊Salinas数据集实战中的那些‘隐形’优化点

高光谱分类实战&#xff1a;超越精度的Salinas数据集深度优化指南 当我们在Salinas数据集上实现98%的分类准确率时&#xff0c;是否意味着模型已经完美&#xff1f;作为深耕遥感领域多年的技术顾问&#xff0c;我必须指出&#xff1a;高光谱图像分类的工程实践远比表面指标复杂…...

vLLM-v0.11.0快速入门:用OpenAI接口调用本地大模型,5分钟出结果

vLLM-v0.11.0快速入门&#xff1a;用OpenAI接口调用本地大模型&#xff0c;5分钟出结果 1. 为什么选择vLLM&#xff1f; 1.1 什么是vLLM&#xff1f; vLLM是伯克利大学LMSYS组织开源的高性能大语言模型推理框架。它通过创新的内存管理技术&#xff0c;显著提升了模型推理的效…...

Ubuntu 18.04 + CUDA 11.3 下,手把手教你搞定 MinkowskiEngine 的编译安装(附避坑指南)

Ubuntu 18.04 CUDA 11.3 环境下的 MinkowskiEngine 编译实战指南 在3D点云处理和稀疏卷积领域&#xff0c;MinkowskiEngine 凭借其高效的稀疏张量计算能力已成为研究者的重要工具。然而&#xff0c;其复杂的依赖关系和编译过程常常让开发者望而却步。本文将基于 Ubuntu 18.04…...

【回归儿童本位,重构专业底色】学前教育行业的深度思辨与价值坚守(二)

吕坤阳亲笔二、行业高质量发展的核心&#xff1a;回归儿童&#xff0c;摒弃功利化教育随着学前教育普惠政策的推进&#xff0c;行业规范化程度不断提升&#xff0c;但功利化、形式化的教育倾向依然存在&#xff0c;成为高质量发展的阻碍。部分幼儿园为迎合家长“抢跑”需求&…...

如何用Obsidian Image Converter实现图像高效管理?超实用技巧分享

如何用Obsidian Image Converter实现图像高效管理&#xff1f;超实用技巧分享 【免费下载链接】obsidian-image-converter ⚡️ Convert, compress, resize, annotate, markup, draw, crop, rotate, flip, align images directly in Obsidian. Drag-resize, rename with variab…...

AI数字人制作:零门槛创建专属虚拟形象

AI数字人制作&#xff1a;零门槛创建专属虚拟形象 【免费下载链接】Duix-Avatar &#x1f680; Truly open-source AI avatar(digital human) toolkit for offline video generation and digital human cloning. 项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avat…...

Z-Image-Turbo-辉夜巫女惊艳效果:神社鸟居背景+巫女舞动姿态动态构图

Z-Image-Turbo-辉夜巫女惊艳效果&#xff1a;神社鸟居背景巫女舞动姿态动态构图 想看看AI如何将“辉夜巫女”的古典神秘与神社鸟居的庄严宁静完美融合&#xff0c;并赋予其灵动的舞姿吗&#xff1f;今天&#xff0c;我们就来深度体验一个名为“Z-Image-Turbo-辉夜巫女”的专属…...

突破性AMD Ryzen硬件调试方案:SMUDebugTool深度解析与实战指南

突破性AMD Ryzen硬件调试方案&#xff1a;SMUDebugTool深度解析与实战指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: ht…...

Whisper语音识别镜像快速部署:5分钟搭建多语言客服转写服务

Whisper语音识别镜像快速部署&#xff1a;5分钟搭建多语言客服转写服务 1. 引言&#xff1a;语音识别在客服场景的挑战 在全球化的商业环境中&#xff0c;客服中心面临着多语言支持的巨大挑战。传统语音识别系统往往需要为每种语言单独部署模型&#xff0c;不仅成本高昂&…...