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

MybatisMybatisPllus公共字段填充与配置逻辑删除

Mybatis/MybatisPllus公共字段填充与配置逻辑删除

在开发过程中,很多时候需要处理一些公共字段,例如:创建时间、修改时间、状态字段等。这些字段通常会在插入或更新数据时进行填充,以便记录数据的变化和状态。同时,逻辑删除也是常见的业务需求,比如删除记录并不是从数据库中物理删除,而是通过更新某个字段(如 is_deleted)来标记数据已被删除。

MyBatis 和 MyBatis-Plus 都提供了相应的机制来处理这些公共字段的填充和逻辑删除。下面我们将分别介绍如何在 MyBatis 和 MyBatis-Plus 中实现公共字段填充与逻辑删除。

1.公共字段填充

mybatis:

在 MyBatis 中,公共字段填充可以通过 TypeHandler 或者使用拦截器(Interceptor)来实现。但更为常见且方便的方式是通过 插件(例如 MyBatis Plus)来进行全局配置。下面我们讲解一种使用拦截器的方式来实现公共字段填充。

MyBatis 支持通过拦截器(Interceptor)来修改执行的 SQL,或者在执行时进行公共字段的填充。你可以定义一个 Interceptor,在插入或更新操作前对公共字段进行填充:

@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
@Component
public class MybatisInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 获取当前执行的 SQLStatementHandler statementHandler = (StatementHandler) invocation.getTarget();MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];BoundSql boundSql = statementHandler.getBoundSql();// 获取 SQL 类型(插入或更新)String sql = boundSql.getSql();if (sql.trim().toUpperCase().startsWith("INSERT")) {// 如果是插入操作,填充公共字段sql = addCommonFieldsForInsert(sql);} else if (sql.trim().toUpperCase().startsWith("UPDATE")) {// 如果是更新操作,填充公共字段sql = addCommonFieldsForUpdate(sql);}// 更新 SQLboundSql.setSql(sql);return invocation.proceed();}private String addCommonFieldsForInsert(String sql) {// 获取当前用户信息(例如从 ThreadLocal 中获取当前用户)String currentUser = getCurrentUser();// 添加创建时间、更新时间、创建人、更新人等字段sql = sql.replace("(", "(create_time, update_time, create_by, update_by, ");sql = sql.replace("values", "values(now(), now(), '" + currentUser + "', '" + currentUser + "', ");return sql;}private String addCommonFieldsForUpdate(String sql) {// 获取当前用户信息(例如从 ThreadLocal 中获取当前用户)String currentUser = getCurrentUser();// 替换 SQL,设置更新时间、更新人if (sql.contains("set")) {sql = sql.replaceFirst("set", "set update_time = now(), update_by = '" + currentUser + "', ");}return sql;}private String getCurrentUser() {// 模拟获取当前用户,实际情况可以通过 ThreadLocal 或 SecurityContext 获取return "admin";  // 假设当前用户是 admin}

记得要把拦截器注册

mybatis-plus:

通过实现MetaObjectHandler接口简化处理。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {// 获取当前登录用户,假设是通过 ThreadLocal 获取当前用户String currentUser = getCurrentUser(); this.strictInsertFill(metaObject, "createBy", String.class, currentUser);this.strictInsertFill(metaObject, "createTime", Date.class, new Date());this.strictInsertFill(metaObject, "updateBy", String.class, currentUser);this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());}@Overridepublic void updateFill(MetaObject metaObject) {// 获取当前登录用户,假设是通过 ThreadLocal 获取当前用户String currentUser = getCurrentUser();this.strictUpdateFill(metaObject, "updateBy", String.class, currentUser);this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());}private String getCurrentUser() {// 假设当前用户信息存储在 ThreadLocal 中return "admin";  // 或者从上下文中获取}
}

2.逻辑删除:

1. MyBatis实现方式

需手动修改所有SQL语句或在拦截器中添加条件。

XML映射文件示例
<select id="selectById" resultType="User">SELECT * FROM user WHERE id = #{id} AND is_deleted = 0
</select><update id="deleteById">UPDATE user SET is_deleted = 1 WHERE id = #{id}
</update>

运行 HTML

2. MyBatis-Plus实现方式

提供全局配置和注解两种方式。

方式1:全局配置(application.yml)
mybatis-plus:global-config:db-config:logic-delete-field: isDeleted   # 逻辑删除字段名logic-delete-value: 1           # 删除标记值logic-not-delete-value: 0       # 未删除标记值
方式2:注解标记
public class User {@TableLogicprivate Integer isDeleted;
}
方式3:Java配置类
@Configuration
public class MyBatisPlusConfig {@Beanpublic GlobalConfig globalConfig() {GlobalConfig config = new GlobalConfig();GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();dbConfig.setLogicDeleteField("isDeleted");dbConfig.setLogicDeleteValue("1");dbConfig.setLogicNotDeleteValue("0");config.setDbConfig(dbConfig);return config;}
}

相关文章:

MybatisMybatisPllus公共字段填充与配置逻辑删除

Mybatis/MybatisPllus公共字段填充与配置逻辑删除 在开发过程中&#xff0c;很多时候需要处理一些公共字段&#xff0c;例如&#xff1a;创建时间、修改时间、状态字段等。这些字段通常会在插入或更新数据时进行填充&#xff0c;以便记录数据的变化和状态。同时&#xff0c;逻…...

VS Code User和System版区别【推荐使用System版本】and VSCode+Keil协同开发之Keil Assistant

VS Code User和System版区别 Chapter1 VS Code User和System版区别1. 对于安装而言2. 结束语 Chapter2 VS Code 安装、配置教程及插件推荐插件&#xff1a; Chapter3 VSCodeKeil协同开发之Keil Assistant1. 效果展示2. Keil Assistant简介3. Keil Assistant功能特性4. 部署步骤…...

MongoDB:listDatabases failed : not master and slaveOk=false

个人博客地址&#xff1a;MongoDB&#xff1a;listDatabases failed : not master and slaveOkfalse | 一张假钞的真实世界 异常描述 如果在MongoDB的SECONDARY上查询数据时会报如下错误信息&#xff1a; > show databases; 2018-09-20T17:40:55.3770800 E QUERY [thread…...

Python的那些事第二十二篇:基于 Python 的 Django 框架在 Web 开发中的应用研究

基于 Python 的 Django 框架在 Web 开发中的应用研究 摘要 Django 是一个基于 Python 的高级 Web 框架,以其开发效率高、安全性和可扩展性强等特点被广泛应用于现代 Web 开发。本文首先介绍了 Django 的基本架构和核心特性,然后通过一个实际的 Web 开发项目案例,展示了 Dj…...

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析④】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase04 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月15日 关键词&#xff1a;UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-004测试用例 用例ID测试场景验证要点参考条款预期…...

图论入门算法:拓扑排序(C++)

上文中我们了解了图的遍历(DFS/BFS), 本节我们来学习拓扑排序. 在图论中, 拓扑排序(Topological Sorting)是对一个有向无环图(Directed Acyclic Graph, DAG)的所有顶点进行排序的一种算法, 使得如果存在一条从顶点 u 到顶点 v 的有向边 (u, v) , 那么在排序后的序列中, u 一定…...

【CXX】2 CXX blobstore客户端说明

本示例演示了一个调用blobstore服务的C客户端的Rust应用程序。事实上&#xff0c;我们会看到两个方向的调用&#xff1a;Rust到C以及C到Rust。对于您自己的用例&#xff0c;您可能只需要其中一个方向。 示例中涉及的所有代码都显示在此页面上&#xff0c;但它也以可运行的形式提…...

HTTP相关面试题

HTTP/1.1、HTTP/2、HTTP/3 演变 HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相⽐ HTTP/1.0 性能上的改进&#xff1a; 使⽤长连接的⽅式改善了 HTTP/1.0 短连接造成的性能开销。⽀持管道&#xff08;pipeline&#xff09;网络传输&#xff0c;只要第⼀个请…...

关于XML映射器的基本问题

前言 XML 映射器是 MyBatis 中用于定义 SQL 语句及其与 Java 对象映射关系的 XML 文件。它通过 XML 配置将数据库操作与 Java 代码分离&#xff0c;使 SQL 语句更易维护和管理。 主要作用 定义 SQL 语句&#xff1a;在 XML 中编写 SQL 查询、插入、更新和删除操作。 映射结果…...

【MyBatis】预编译SQL与即时SQL

目录 1. 以基本类型参数为例测试#{ }与${ }传递参数的区别 1.1 参数为Integer类型 1.2 参数为String类型 2. 使用#{ }传参存在的问题 2.1 参数为排序方式 2.2 模糊查询 3. 使用${ }传参存在的问题 3.1 SQL注入 3.2 对比#{ } 与 ${ }在SQL注入方面存在的问题 3.3 预编译…...

Python--正则表达式

1. 日志打印与终端颜色控制 1.1 使用 loguru​ 打印日志 from loguru import loggerlogger.debug("调试信息") logger.info("普通信息") logger.warning("警告信息") logger.error("错误信息") logger.success("成功信息"…...

【java面试】线程篇

1.什么是线程&#xff1f; 线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位。 2.线程和进程有什么区别&#xff1f; 线程是进程的子集&#xff0c;一个进程可以有很多线程&#xff0c;每条线程并行执行不同的任…...

分布式光纤传感:为生活编织“感知密网”

分布式光纤测温技术虽以工业场景为核心&#xff0c;但其衍生的安全效益已逐步渗透至日常生活。 分布式光纤测温技术&#xff08;DTS&#xff09;作为一种先进的线型温度监测手段&#xff0c;近年来在多个领域展现了其独特的优势。虽然其核心应用场景主要集中在工业、能源和基础…...

cmake Qt Mingw windows构建

今天教大家怎么在windows构建qt应用使用cmd命令行&#xff0c;而不是一键通过QtCreator一键构建。首先我们用qtcreator创建一个模板程序(PS&#xff1a;记得在安装qt时要悬着mingw套件&#xff0c;如果安装太慢可以换源&#xff09; 输入以下的命令&#xff1a; mkdir build …...

无人机信号调制技术原理

一、调制技术的必要性 频谱搬移&#xff1a;将低频的基带信号搬移到高频的载波上&#xff0c;便于天线辐射和传播。 信道复用&#xff1a; 利用不同的载波频率或调制方式&#xff0c;实现多路信号同时传输&#xff0c;提高信道利用率。 抗干扰&#xff1a; 通过选择合适的调…...

书评与笔记:《如何有效报告Bug》

文章目录 书评笔记核心原则1. 首要目标&#xff1a;让程序员亲眼看到问题2. 次要目标&#xff1a;详细描述问题3. 保持冷静&#xff0c;避免误操作4. 提供额外信息5. 清晰、准确地表达 实用建议不要自作聪明地诊断问题类比&#xff1a;看医生时的症状描述程序员的心理 总结 原文…...

3.【线性代数】——矩阵乘法和逆矩阵

三 矩阵乘法和逆矩阵 1. 矩阵乘法1.1 常规方法1.2 列向量组合1.3 行向量组合1.4 单行和单列的乘积和1.5 块乘法 2. 逆矩阵2.1 逆矩阵的定义2.2 奇异矩阵2.3 Gauss-Jordan 求逆矩阵2.3.1 求逆矩阵 ⟺ \Longleftrightarrow ⟺解方程组2.3.2 Gauss-Jordan求逆矩阵 1. 矩阵乘法 1.…...

[JVM篇]虚拟机性能监控、故障处理工具

虚拟机性能监控、故障处理工具 基础故障处理工具 jps&#xff08;JVM Peocess Status Tool - 虚拟机进程状况工具&#xff09; jstat(JVM Statistics Monitoring Too - 虚拟机统计信息监视工具) jinfo( Configuration info for Java - Java配置信息工具) jmap(Memory Map for…...

UniApp 中 margin 和 padding 属性的使用详解

margin 属性的作用与使用 margin 属性用于设置元素的外边距&#xff0c;也就是元素与其他元素之间的距离。它可以分别设置元素四个方向&#xff08;上、右、下、左&#xff09;的外边距&#xff0c;也支持使用简写形式来一次性设置多个方向的外边距。 <template><view…...

`fi` 是 Bash 脚本中用来结束 `if` 条件语句块的关键字

fi 是 Bash 脚本中 if 语句的结束标志&#xff0c;它用于结束一个 if 块。与其他编程语言&#xff08;如 C、Java&#xff09;中的 } 不同&#xff0c;Bash 使用 fi 来标识条件语句的结束。 语法示例&#xff1a; if [ condition ]; then# 如果条件为真时执行的代码echo &quo…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...