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

MybatisPlus的主键ID生成策略和公共字段自动填充的使用及注意事项

主键策略(ID自动生成)

以下是MyBatis-Plus中常见的几种主键生成策略及其对应的枚举值(3.3.0之前的版本):

主键生成策略枚举值
数据库自增IdType.AUTO
用户输入IdType.INPUT
分布式全局唯一IDIdType.ID_WORKER
分布式全局唯一ID(字符串类型)IdType.ID_WORKER_STR
UUIDIdType.UUID
雪花算法全局唯一IDIdType.SNOWFLAKE
雪花算法全局唯一ID(字符串类型)IdType.SNOWFLAKE_STR

3.3.0之后的版本:

描述
AUTO数据库自增,适用于MySQL、SQL Server等数据库
INPUT手动输入,适用于全局唯一ID的情况,自定义
ASSIGN_UUID32位UUID字符串
ASSIGN_ID分布式全局唯一ID,雪花算法生成
NONE无状态,可以通过全局唯一ID进行填充
public enum IdType {AUTO(0),            //数据库自增长,mysql的自增长主键NONE(1),            //未设置INPUT(2),           //自定义设置ASSIGN_ID(3),   //分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),//使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)ASSIGN_UUID(4); //分配 UUID,主键类型为 String(since 3.3.0),//使用接口IdentifierGenerator的方法nextUUID(默认default 方法)private final int key;private IdType(int key) {this.key = key;}public int getKey() {return this.key;}
}

配置文件中全局配置:

#配置数据源
spring:datasource:druid:url: jdbc:mysql://localhost:3306/book_db?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=trueusername: rootpassword: 123driver-class-name: com.mysql.cj.jdbc.Driver#mybatisplus配置
mybatis-plus:global-config:db-config:#配置id自增长,ID自动生成策略id-type: autoconfiguration:#配置mybatisplus日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:/mapper/*.mapper.xml      #xml文件的位置(resources下的mapper文件夹)

注: 实体类@TableId注解的type属性会覆盖全局属性,优先以各实体类的配置为主,未配置的则全局配置生效

公共字段自动填充的使用

  1. 实体类公共字段 添加@TableField注解,配置fill属性:
描述
INSERT插入时填充
UPDATE更新时填充
INSERT_UPDATE插入和更新时填充
DEFAULT默认不填充
  1. 实现MetaObjectHandler接口,重写insertFill和updateFill方法,并注册为Bean
@Slf4j
@Component
public class MybatisplusHandler implements MetaObjectHandler {// 插入时的填充策略/*** 数据创建时间的属性名*/public static final String FIELD_CREATE_TIME = "createTime";/*** 数据最后修改时间的属性名*/public static final String FIELD_UPDATE_TIME = "updateTime";public static final String FIELD_CREATE_USER = "createUser";public static final String FIELD_UPDATE_USER = "updateUser";@Overridepublic void insertFill(MetaObject metaObject) {LocalDateTime now = LocalDateTime.now();Long id = BaseContext.getCurrentId();log.info("开始执行插入时的自动填充");log.info("metaob{}",metaObject.toString());this.strictInsertFill(metaObject,FIELD_CREATE_USER, Long.class, id);this.strictUpdateFill(metaObject,FIELD_UPDATE_USER, Long.class, id);this.strictInsertFill(metaObject,FIELD_CREATE_TIME, LocalDateTime.class, now);this.strictUpdateFill(metaObject,FIELD_UPDATE_TIME, LocalDateTime.class, now);}@Overridepublic void updateFill(MetaObject metaObject) {LocalDateTime now = LocalDateTime.now();Long id = BaseContext.getCurrentId();this.strictUpdateFill(metaObject,FIELD_UPDATE_TIME, LocalDateTime.class, now);this.strictUpdateFill(metaObject,FIELD_UPDATE_USER, Long.class, id);}
}

注意事项:在使用公共字段自动填充和id自动生成时,自定义的insert和update的Mapper方法不得进行判空,否则自动填充不生效。这是由于mybatisplus的底层是先执行自定义的SQL,后填充。此时公共自段未传入,如果进行判空的话,mybatis就不会拼接该字段,后面填充时也不会插入该字段。

 <insert id="insert" parameterType="com.sky.entity.Employee">INSERT INTO employee<trim prefix="(" suffix=")" suffixOverrides=",">id,<if test="name != null">name,</if><if test="username != null">username,</if><if test="password != null">password,</if><if test="phone != null">phone,</if><if test="sex != null">sex,</if><if test="idNumber != null">id_number,</if><if test="status != null">status,</if>create_time,update_time,create_user,update_user</trim>VALUES<trim prefix="(" suffix=")" suffixOverrides=",">#{id,jdbcType=BIGINT},<if test="name != null">#{name,jdbcType=VARCHAR},</if><if test="username != null">#{username,jdbcType=VARCHAR},</if><if test="password != null">#{password,jdbcType=VARCHAR},</if><if test="phone != null">#{phone,jdbcType=VARCHAR},</if><if test="sex != null">#{sex,jdbcType=VARCHAR},</if><if test="idNumber != null">#{idNumber,jdbcType=VARCHAR},</if><if test="status != null">#{status,jdbcType=INTEGER},</if>#{createTime,jdbcType=TIMESTAMP},#{updateTime,jdbcType=TIMESTAMP},#{createUser,jdbcType=BIGINT},#{updateUser,jdbcType=BIGINT}</trim></insert>```

相关文章:

MybatisPlus的主键ID生成策略和公共字段自动填充的使用及注意事项

主键策略&#xff08;ID自动生成&#xff09; 以下是MyBatis-Plus中常见的几种主键生成策略及其对应的枚举值&#xff08;3.3.0之前的版本&#xff09;&#xff1a; 主键生成策略枚举值数据库自增IdType.AUTO用户输入IdType.INPUT分布式全局唯一IDIdType.ID_WORKER分布式全局…...

【GitHub项目推荐--微软开源的可视化工具】【转载】

说到数据可视化&#xff0c;大家都很熟悉了&#xff0c;设计师、数据分析师、数据科学家等&#xff0c;都需要用各种方式各种途径做着数据可视化的工作.....当然许多程序员在工作中有时也需要用到一些数据可视化工具&#xff0c;如果工具用得好&#xff0c;就可以把原本枯燥凌乱…...

Python基础之文件操作(I/O)

和其他编程语言一样&#xff0c;Python 也具有操作文件&#xff08;I/O&#xff09;的能力&#xff0c;比如打开文件、读取和追加数据、插入和删除数据、关闭文件、删除文件等。合理应用python提供的文件操作基本函数&#xff0c;可大大提高自动化实现的效率与框架代码的稳定性…...

k8s--helm

什么是helm&#xff1f;在没有这个helm之前&#xff0c;deployment service ingress helm的作用 通过打包的方式&#xff0c;把deployment service ingress等打包在一块&#xff0c;一键式的部署服务&#xff0c;类似yum安装 官方提供的一个类似与安装仓库额功能&#xff0c;…...

算法训练营第五十六天|583. 两个字符串的删除操作 72. 编辑距离

目录 Leetcode583. 两个字符串的删除操作Leetcode72. 编辑距离 Leetcode583. 两个字符串的删除操作 文章链接&#xff1a;代码随想录 题目链接&#xff1a;583. 两个字符串的删除操作 思路&#xff1a;直接记录需要改&#xff08;增或删&#xff09;几个&#xff0c;也就是求不…...

使用WAF防御网络上的隐蔽威胁之目录穿越

目录穿越&#xff08;Directory Traversal&#xff09;是一种网络安全攻击手段&#xff0c;也被称为路径穿越。 这种攻击允许攻击者访问存储在Web服务器文件系统上的文件和目录&#xff0c;这些文件和目录原本不应该对用户可见或可访问。 通过利用安全漏洞&#xff0c;攻击者…...

Linux:vim的相关知识

目录 vim 是一个较为常见的编译文件的命令操作。 三种模式的区分的作用如下&#xff1a; 命令模式&#xff1a; 插入模式&#xff1a; 进入插入模式的标志&#xff1a;左下角有INSERT 底行模式&#xff1a; 命令模式的常见命令&#xff1a; 底行模式常见命令&#xff1…...

Qt 国产嵌入式操作系统实现文字转语音功能(ekho库)

1.简介 Qt 国产嵌入式操作系统实现文字转语音功能(TTS)_tts驱动 转文字-CSDN博客 在继上篇文章之后,甲方粑粑不满意使用eSpeak发出的声音太难听了,这就不得不找个替代品,声音稍微好听了一些。 使用ekho开源库。 Ekho(余音)是一个免费、开源的中文语音合成软件。它目…...

Redis常见类型及常用命令

目录 常见的数据类型 一、String类型 1、简介 2、常用命令 &#xff08;1&#xff09;新建key &#xff08;2&#xff09;设值取值 ​编辑 &#xff08;3&#xff09;批量操作 &#xff08;4&#xff09;递增递减 3、原子性操作 4、数据结构 二、list类型 1、list常…...

实战纪实 | 某配送平台zabbix 未授权访问 + 弱口令

本文由掌控安全学院 - 17828147368 投稿 找到一个某src的子站&#xff0c;通过信息收集插件wappalyzer&#xff0c;发现ZABBIX-监控系统&#xff1a; 使用谷歌搜索历史漏洞&#xff1a;zabbix漏洞 通过目录扫描扫描到后台&#xff0c;谷歌搜索一下有没有默认弱口令 成功进去了…...

【第十五课】数据结构:堆 (“堆”的介绍+主要操作 / acwing-838堆排序 / c++代码 )

目录 关于堆的一些知识的回顾 数据结构&#xff1a;堆的特点 "down" 和 "up"&#xff1a;维护堆的性质 down up 数据结构&#xff1a;堆的主要操作 acwing-838堆排序 代码如下 时间复杂度分析 确实是在写的过程中频繁回顾了很多关于树的知识&…...

前端JavaScript篇之JavaScript有哪些数据类型,它们的区别?

目录 JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f;数据类型区别 JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; 数据类型 JavaScript数据类型有&#xff1a; Undefined、Null、Boolean、Number、String、Array、Object、Symbol、BigInt… St…...

LeetCode---380周赛

题目列表 3005. 最大频率元素计数 3006. 找出数组中的美丽下标 I 3007. 价值和小于等于 K 的最大数字 3008. 找出数组中的美丽下标 II 一、最大频率元素计数 这题就是个简单的计数题&#xff0c;正常遍历统计数据即可&#xff0c;关键是你要会写代码逻辑。 代码如下&…...

archlinux 如何解决安装以后没有声音的问题

今天安装完archlinux以后发现看视频没声音 检查一下是否有 /lib/firmware/intel/sof 发现没有 如果你也是这样的话&#xff0c;可以尝试安装&#xff1a; sudo pacman -S sof-firmware 重启后再看看有没有声音&#xff1a; reboot 反正我有声音了...

什么是ORM思想?

1. ORM概念 ORM&#xff08;Object Relational Mapping&#xff09;对象关系映射模式&#xff0c;是一种技术&#xff0c;解决了面向对象与关系型数据库存互不匹配的现象。 ORM在业务逻辑层和数据库层之间充当了桥梁的作用。 2. ORM由来 在软件开发的过程中&#xff0c;通常…...

设计接口时,为其添加签名鉴权---详细教程

一、何为签名 我们知道无论是restful api还是传统接口、亦或是其他形式接口的调用&#xff0c;接口签名都是非常重要的安全机制&#xff0c;它可以确保请求的发起者是经过认证和授权的客户端&#xff0c;同时也可以防止接口被攻击&#xff0c;请求参数被篡改等等。 用大白话来解…...

5G+物联网:连接万物,重塑智慧社区,开启未来生活新纪元,助力智慧社区的革新与发展

一、5G与物联网&#xff1a;技术概述与基础 随着科技的飞速发展&#xff0c;第五代移动通信技术&#xff08;5G&#xff09;和物联网&#xff08;IoT&#xff09;已经成为当今社会的热门话题。这两项技术作为现代信息社会的核心基础设施&#xff0c;正深刻地改变着人们的生活和…...

[反转链表] [合并两个有序链表][分割链表]

这里写目录标题 反转链表合并两个有序链表分割链表 反转链表 1、题目&#xff1a; 2.思路  思路1&#xff1a;建立一个newHead,取一个节点进行头插。具体做法如下&#xff01; 建立一个newHead(新头)&#xff0c;由于一个节点里面存的是下一个节点的地址&#xff0c;如果取…...

中文数据让LLM变笨?

我这里先贴一下论文的原链接&#xff1a; https://arxiv.org/abs/2401.10286 然后贴一下我翻译标注的下载链接&#xff1a;https://gitee.com/chatpaper/arXiv_top_chinese/blob/master/0801_top/%E4%B8%AD%E6%96%87%E4%BC%9A%E8%AE%A9LLM%E5%8F%98%E7%AC%A8%EF%BC%9F.pdf 先…...

【代码随想录】刷题笔记Day54

前言 差单调栈就结束代码随想录一刷啦&#xff0c;回家二刷打算改用python补充进博客&#xff0c;小涛加油&#xff01;&#xff01;&#xff01; 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 双指针法 中心点外扩&#xff0c;注意中心点可能有一个元素可能有两个…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...