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,要求其主键类型为数字或者字符串,使用接口 IdentifierGenerator 的 nextId 方法(默认实现类为 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 注解用于将某个成员变量指定为数据表主键,以下为使用示例: 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方法 源码: 2-2、isNull方法、nonNull方法 三、小结...
脚手架vue-cli,webpack模板
先安装node.js,它是服务器端,用于给页面提供服务。前端学习不需要会node.js,只需要学会node.js衍生出来的npm命令即可。 npm 是node.js的一个工具,作用是进行包管理,npm是node.js的包管理器。 接着安装脚手架ÿ…...
什么是React Native?
写在前面 React Native (RN) 是一个由 Facebook 开发的开源框架,用于构建跨平台的移动应用程序。它允许开发者使用 JavaScript 和 React 来创建原生 iOS 和 Android 应用。RN 的出现极大地简化了移动应用的开发过程,使得开发者可以更快速、更高效地构建…...
Three.js LOD(Level of Detail)通过根据视距调整渲染细节的技术
在 Three.js 中,LOD(Level of Detail)技术是一种通过根据视距调整渲染细节的技术,旨在提高渲染性能并优化用户体验。LOD 技术尤其在处理复杂场景或高多边形模型时显得尤为重要。在这篇博客中,我们将详细介绍 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 讨论了受聘、雇用和工作面试的过程。如果人是团队中最重要的部分,我们如何选择与谁一起工作࿱…...
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. 二叉搜索树中的搜索
目录 题目描述: 代码: 题目描述: 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 示例 1: 输入:root [4,2,7,1,3…...
用邻接矩阵实现图的深度优先遍历
问题描述 给定一个无向图,用邻接矩阵作为图的存储结构,输出指定顶点出发的深度优先遍历序列。在深度优先遍历的过程中,如果同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问。 输入描述 第一行输入三个正整数&#…...
vue2中实现token的无感刷新
后端配置 设置Token过期时间:在后端(如服务器或网关)配置access_token和refresh_token的过期时间。通常,access_token的过期时间较短,而refresh_token的过期时间较长。提供刷新Token接口:后端需要提供一个…...
无需Photoshop即可在线裁剪和调整图像大小的工具
Bitmind是一个灵活且易于使用的批量图像本地化处理器,经过抓包看,这个工具在浏览器本地运行,不会上传图片到服务器,所以安全性完全有保证。 它可以将图像调整到任何特定尺寸,并在必要时按比例裁剪。 这是一个在线工具…...
云安全之法律和合规
0x00 前言 本文主要内容是从法律,合同,电子举证,以及合规和审计这五个部分来记录一下相关的云安全内容 0x01 法律 受法律约束的影响因素 云服务所在的地区云用户所在的区域数据主体所在的区域 GDPR:通用数据保护法案…...
倒计时功能分享
今天想要分享的是一个面试题,也是一个我们在项目中常用的功能:倒计时。 首先我们在写倒计时的时候必须要考虑到是:准确性、性能。接下来我们一步一步实现这个完美地倒计时功能。 setInterval 先来简单实现一个倒计时的函数: func…...
【论文分享】使用多源数据识别建筑功能:以中国三大城市群为例
建筑功能对城市规划至关重要,而利用多源数据进行建筑功能分类有助于支持城市规划政策。本研究通过分析建筑特征和POI密度,识别了中国三个城市群的建筑功能,并使用XGBoost模型验证了其在大规模映射中的高准确性和有效性。研究强调了建筑环境对…...
华为手机启用ADB无线调试功能
打开开发者模式,勾选USB调试,和“仅充电”模式下允许ADB调试 确认 设置添加adb路径到PATH变量 使用adb查看安卓设置 切换为无线模式: 查看手机IP...
云原生之Kubernetes集群搭建
1、Kubernetets基础概念 传统的服务器架构演进,现在基于docker容器化应用可以完成快速部署,但是对于大型的应用,有可能出现成百上千个容器化应用,一个挂了需要人工管理是相当麻烦,因此急需一个大规模容器编排系统。 Kubernetes Kubernetes 是一个可移植、可扩展的开源平…...
STM32单片机CAN总线汽车线路通断检测
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着汽车电子技术的不断发展,车辆通信接口在汽车电子控…...
大连理工大学概率上机作业免费下载
大连理工大学概率论与数理统计上机资源 本资源库收录了大连理工大学概率论与数理统计课程的上机作业范例代码,旨在通过实际操作加深学生对概率统计概念的理解,帮助学生更好地理解和掌握知识点。 作业内容概览 第一题:随机变量关系探索 数…...
Tomcat 如何管理 Session
Tomcat 如何管理 Session 我们知道,Tomcat 中每一个 Context 容器对应一个 Web 应用,而 Web 应用之间的 Session 应该是独立的,因此 Session 的管理肯定是 Context 级的,也就是一个 Context 一定关联多个 Session。 Tomcat 中主…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
