MySQL中使用delete_at(时间戳)作为逻辑删除标记时如何使用MyBatis-Plus逻辑删除组件插入时间戳,以及如何解决自动填充失效的问题

news2024/11/17 3:25:11

背景

MySQL中使用delete_at(时间戳)作为逻辑删除标记

在业务中,使用逻辑删除是普遍做法,通常会使用一个名为deleted(0/1)的字段表示删除状态。

但是如果遇到有唯一约束,且可能反复删除和重新插入的表(如用户表,注销用户使用逻辑删除,同时表中有用户名的唯一索引约束)时,如果唯一键约束的对象在逻辑删除后重新插入,会遭遇主键冲突。

这时候的其中一个合理的解决方案是:使用delete_at作为逻辑删除标记,0表示未删除,使用delete操作时的时间戳作为已被删除的标记

MyBatis-Plus的逻辑删除组件

官网组件地址:https://www.baomidou.com/pages/6b03c5/

MyBatis-Plus作为广泛使用的ORM组件,提供了方便好用的逻辑删除组件,但文档中给出的实例仅囊括了使用0/1作为逻辑删除标记的使用场景。

MyBatis-Plus的自动填充功能

官网组件地址:https://www.baomidou.com/pages/4c6bcf/

MyBatis-Plus提供了自动填充组件。在笔者的项目中,使用这个组件填充update_by(更新人)字段。但是在使用了逻辑删除组件后,调用delete()方法时,发现没有进行自动填充。

本文讨论在使用时间戳作为逻辑删除标记时,如何使用MyBatis-Plus的逻辑删除组件,同时如何解决自动填充功能失效的问题。

解决方案

如何使用@TableLogic注解为delete_at字段自动填入时间戳?

笔者的项目中有些表使用deleted字段作为逻辑删除标记,有些表使用delete_at,所以不能直接使用官网上的步骤 1: 配置com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig。因此,笔者选择了@TableLogic注解。该注解源码如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
public @interface TableLogic {

    /**
     * 默认逻辑未删除值(该值可无、会自动获取全局配置)
     */
    String value() default "";

    /**
     * 默认逻辑删除值(该值可无、会自动获取全局配置)
     */
    String delval() default "";
}

其中,delval属性即为进行逻辑删除时对逻辑删除字段的填充值。而我们的需求是:填入当前时间戳,那么,直接使用MySQL中自带函数UNIX_TIMESTAMP()即可作为delval属性的值。完整代码如下;

    /**
     * 删除时间节点时间戳
     */
    @TableField("delete_at")
    @TableLogic(value = "0", delval = "UNIX_TIMESTAMP()")
    private Long deleteAt;

执行效果如下图:
自动填充时间戳函数到detete_at字段

解决自动填充功能失效的问题

笔者项目的PO中,使用了@TableField(fill = FieldFill.INSERT_UPDATE)作为自动填充标记。代码如下:

    /**
     * 修改人
     */
    @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
    private String updateBy;

但是发现在调用int delete(@Param("ew") Wrapper<T> queryWrapper)方法进行删除时,虽然触发了逻辑删除功能,执行了update语句,但并没有对updateBy自动填充。
查询文档后发现在“常见问题”中有“删除接口自动填充功能失效”一节。
常见问题:删除接口自动填充功能失效
根据其中的提示,笔者使用了deleteById()方法。但发现问题依旧。
后来,经过阅读源码,发现deleteById()有2个重载方法,源码如下:

    int deleteById(Serializable id);

    int deleteById(T entity);

而笔者原来使用的是第一个重载方法。抱着试试看的心理,使用了第二个重载方法,后发现真的可以使用。见图:
update_by自动填充生效
至此,问题全部解决。

补充

关于MyBatis-Plus版本

经过翻阅其它的一些技术文章,发现“删除接口自动填充功能失效”一节中提到的“使用 deleteById 方法(推荐)”是在2022/10/01更新的,而在之前的版本中并没有这句话。推测该功能应当是在2022/10/01之前的最后一个release版本增加上去的。根据github上的Releases日志,推荐大家将自己的版本更新到3.5.1及以上,来使用新特性。

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

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

相关文章

chatgpt如何引入本地知识?我们来看下emnlp 2022如何将本地图谱知识引入到任务型对话系统中

一、概述 title&#xff1a;Injecting Domain Knowledge in Language Models for Task-Oriented Dialogue Systems 论文地址&#xff1a;https://arxiv.org/abs/2212.08120 代码&#xff1a;GitHub - amazon-science/domain-knowledge-injection 1.1 Motivation 如何在PLM…

SIFT描述子实现

参考&#xff1a;SIFT图像匹配原理及python实现&#xff08;源码实现及基于opencv实现&#xff09; #include <iostream> #include <opencv2/opencv.hpp> #define _USE_MATH_DEFINES #include <math.h> #include <numeric>float mod_float(float x, f…

YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析

前言 最近我在研究YOLOv5的改进&#xff0c;一个模型的好坏、改进后效果如何都是需要一系列指标来判断的。这篇就是我将这几天学到的内容做一下总结。 友情提醒&#xff1a;本篇干货较多&#xff0c;建议先再慢慢看噢&#xff01; ​ &#x1f340;本人YOLOv5源码详解系列&…

大规模并行处理架构Doris入门操作

目录 1 基本概念1.1 Row & Column1.2 Tablet & Partition 2 创建用户2.1 创建数据库并赋予权限2.2 Doris 建表、数据导入与删除 3 建表&#xff08;Create Table&#xff09;3.1 字段类型3.2 数据划分3.3 关于 Partition 和 Bucket 的数量和数据量的建议3.4 演示单分区…

UML状态图详解

上篇文章&#xff0c;介绍了UML的基础知识&#xff0c;并详细介绍了UML中类图的知识点与画法。 本篇&#xff0c;来继续介绍UML中的另一种图——状态图。 1 UML状态图简介 状态图&#xff0c;显示一个状态机&#xff0c;属于UML活动图。 UML具有许多不同类型的图表&#xff…

<代码分享> 分支定界算法的 Python 代码框架

本文以求解整数规划模型为例&#xff0c;提供分支定界算法的 Python 代码框架&#xff0c;期待完善、指正和交流。 文件结构 具体代码 problem.py 定义问题的格式&#xff1a; from typing import Listclass Problem(object):"""problem"""de…

OneAPI 编译cp2k 9.1和cp2k 2023.1

环境信息&#xff1a; Rocky Linux 8.6 Linux server 4.18.0-425.19.2.el8_7.x86_64 gcc version 8.5.0 20210514 (Red Hat 8.5.0-16) (GCC) OneAPI 2023 Intel(R) oneAPI DPC/C Compiler 2023.0.0 (2023.0.0.20221201) ifort version 2021.8.0 一、编译cp2k 9.1 这里用的…

linux系统下常用软件的安装与操作实现

本文来介绍下如何在 Linux 上安装 Windows 上常用的软件&#xff0c;桌面更多的用的是 Ubuntu &#xff0c;下面就以 Ubuntu 为例。 目录 一、安装环境 二、安装步骤 三、总结 一、安装环境 本文使用的安装环境&#xff0c;如下所示&#xff1a; linuxylinuxy:~$ cat /proc…

【Python】【进阶篇】25、Django for标签详解

目录 25、Django for标签详解1. for标签的使用2. for标签嵌套使用3. forloop变量详解 25、Django for标签详解 通过上一节的《Django if标签详解》的讲解&#xff0c;我相信大家对于模板标签已经不再陌生&#xff0c;在本节我们再给大家隆重介绍一位最熟悉的陌生人&#xff0c…

如何熟练的使用trtexec

目录 如何熟练的使用trtexec前言1. 参数解释1.1 Model Options1.2 Build Options1.3 Inference Options1.4 Reporting Options1.5 System Options1.6 完整的参数 如何熟练的使用trtexec 前言 杜老师推出的 trtexec 工具的使用课程&#xff0c;链接。记录下个人学习笔记&#x…

禁止Windows更新自动安装驱动程序

禁止Windows更新自动安装驱动程序 问题解决方案方案1&#xff1a;修改系统设置方案2&#xff1a;修改组策略方案3&#xff1a;修改注册表方案4&#xff1a;回退驱动 问题 Windows更新时&#xff0c;会自动更新驱动程序&#xff0c;甚至有时会将驱动程序反向更新&#xff0c;替…

使用 webdriver API 编写自动化脚本的基本语法

文章目录 1. 打开和关闭浏览器1&#xff09;打开浏览器并访问 URL2&#xff09;关闭浏览器窗口 2. 元素的定位1&#xff09;以 id 定位元素2&#xff09;以 name 定位元素3&#xff09;以 tag name 定位元素4&#xff09;以 class name 定位元素5&#xff09;以 xpath 定位元素…

第九章 控制单元的功能课后习题

指令周期有四个阶段&#xff1a;取值 间址 执行 中断 &#xff0c;控制单元为了完成不同指令会发出不同的操作命令&#xff0c;这些操作信号控制着计算机所有部件有次序的完成不同的操作&#xff0c;以达到执行程序的目的。 控制单元的外特性 9.2控制单元的功能是什么?其输入…

【Java+GS】GeoServer——使用Java发布图层(SHP文件和DB数据库),附自用工具类

文章目录 SHP文件发布逻辑 1、获取到geoserver的manager对象2、调用createWorkArea方法&#xff0c;参入manager&#xff0c;创建空间空间 workArea3、调用createShpDataPool方法&#xff0c;创建数据存储4、发布样式Style.5、发布图层 调用业务层库发布shp文件图层业务逻辑如下…

【致敬未来的攻城狮计划】— 连续打卡第二十五天:RA2E1的 DTC传输模式

系列文章目录 由于一些特殊原因&#xff1a; 系列文章链接&#xff1a;&#xff08;其他系列文章&#xff0c;请点击链接&#xff0c;可以跳转到其他系列文章&#xff09; 24.RA2E1的 DMAC——数据传输 文章目录 系列文章目录 前言 一、DTC是什么&#xff1f; 二、DTC内部寄存…

Springboot——集成Elastic Job实现任务调度

目录 1.任务调度 2.Elastic Job 3.springboot集成Elastic Job 1.任务调度 什么是任务调度&#xff1f; 任务调度就是指系统为了自动地完成特定任务&#xff0c;在指定的时刻去执行任务的过程&#xff0c;其目的是为了让系统自动且精确地完成任务从而解放人力资源。 如&am…

WX小程序 - 1

视图层&#xff1a;WXML&#xff0c;WXSS 逻辑层&#xff1a;JS 响应数据绑定&#xff0c;事件绑定 勾选这个其实就是解决跨域问题&#xff08;仅限本地开发阶段&#xff09;。 上线需要去合法域名添加。 app.json 文件创建和删除&#xff0c;保持一致&#xff0c;否则报错…

二叉树的层序遍历思想模板

分为两种&#xff1a; 1.第一种是直接将遍历的数据保存到列表里&#xff1b; 2.第二种是将每一层的数据以列表形式保存在列表&#xff1b;&#xff08;今天要讲述的内容&#xff09; 代码如下&#xff0c;思想在后 class Solution {public List<List<Integer>> …

全新 – Amazon EC2 R6a 实例由第三代 AMD EPYC 处理器提供支持,适用于内存密集型工作负载

我们在 Amazon re:Invent 2021 上推出了通用型 Amazon EC2 M6a 实例&#xff0c;并于今年 2 月推出了计算密集型 C6a 实例。这些实例由运行频率高达 3.6 GHz 的第三代 AMD EPYC 处理器提供支持&#xff0c;与上一代实例相比&#xff0c;性价比提高多达 35%。 如今&#xff0c;…

不断联的从Google Drive下载超大文件

不断联的从Google Drive下载超大文件 最近在研究OWOD代码&#xff0c;需要从google drive 下载超大文件&#xff0c;普通方式下载&#xff0c;首先得有个上外网的工具&#xff0c;其次下载过程中总是会断开&#xff0c;所以看了一些博客&#xff0c;总结如下&#xff1a; 安…