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

2. 如何让mybatis-plus的逻辑删除注解@TableLogic临时失效

文章目录

  • 如何让mybatis-plus的逻辑删除注解@TableLogic临时失效
    • 1. 场景复现
      • 1.1 controller代码
      • 1.2 service层代码
      • 1.3 entity代码
    • 2. 问题分析
    • 3. 解决方案
      • 3.1 说明
      • 3.2 核心代码
      • 3.3 service方法对应修改为
      • 3.4 运行结果

如何让mybatis-plus的逻辑删除注解@TableLogic临时失效

1. 场景复现

1.1 controller代码

@GetMapping("/getSpacexTable")
public String getSpacexTable(){List<SpacexTable> list = spacexTableService.queryAll();return JSON.toJSONString(list);
}

1.2 service层代码

@Override
public List<SpacexTable> queryAll() {List<SpacexTable> list = list();return list;
}

1.3 entity代码

@Data
@TableName(value ="spacex_table")
public class SpacexTable implements Serializable {@TableIdprivate String id;private String name;@TableLogicprivate Integer isDel;@TableField(exist = false)private static final long serialVersionUID = 1L;
}

2. 问题分析

当我们正常调用接口时,sql查询日志为

SELECT id,name,is_del FROM spacex_table WHERE is_del=0

数据库数据记录为:
在这里插入图片描述
接口调用结果为

[{"id":"1","isDel":0,"name":"小张"},{"id":"3","isDel":0,"name":"小杨"}]

可见逻辑删除注解已生效,is_del=1的小李没有查询出来

3. 解决方案

3.1 说明

  1. 我们让当前查询的逻辑删除失效时,不应影响其他查询活动,所以我们我们需要在线程上打上标识,区分是否执行逻辑删除
  2. 因为使用了mybatis-plus框架,所以可以通过拦截器来实现,在适当方法处,将sql语句中的逻辑删除替换掉即可

3.2 核心代码

@Slf4j
@Component
// 拦截StatementHandler的prepare方法,改变编译的SQL语句
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class LogicDeletenterceptor implements Interceptor {// 通过ThreadLocal给当前线程打上标识public static ThreadLocal<Boolean> logicDelete = new ThreadLocal();@Overridepublic Object intercept(Invocation invocation) throws Throwable {log.info("====SqlModifyInterceptor======(" + logicDelete.get() + ")=====");// 判断线程标识if (!Boolean.FALSE.equals(logicDelete.get())) {return invocation.proceed();}StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget());MetaObject metaObject = SystemMetaObject.forObject(statementHandler);MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");if (!SqlCommandType.SELECT.equals(mappedStatement.getSqlCommandType())) {return invocation.proceed();}BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");String sql = boundSql.getSql();log.info("origin sql:" + sql);// TODO 在这里替换字段,改成不影响结果的条件即可sql = sql.replace("is_del=0","1=1").replace("del_number=0", "1=1");metaObject.setValue("delegate.boundSql.sql",sql);log.info("modify sql:" + sql);return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {}
}

3.3 service方法对应修改为

@Override
public List<SpacexTable> queryAll() {// 开启逻辑删除失效    LogicDeletenterceptor.logicDelete.set(false);List<SpacexTable> list = list();// 关闭逻辑删除失效LogicDeletenterceptor.logicDelete.remove();return list;
}

3.4 运行结果

sql查询日志为

SELECT id,name,is_del FROM spacex_table WHERE 1=1

接口调用结果为

[{"id":"1","isDel":0,"name":"小张"},{"id":"2","isDel":1,"name":"小李"},{"id":"3","isDel":0,"name":"小杨"}]

可见逻辑删除is_del=1的小李也被查询出来了

相关文章:

2. 如何让mybatis-plus的逻辑删除注解@TableLogic临时失效

文章目录 如何让mybatis-plus的逻辑删除注解TableLogic临时失效1. 场景复现1.1 controller代码1.2 service层代码1.3 entity代码 2. 问题分析3. 解决方案3.1 说明3.2 核心代码3.3 service方法对应修改为3.4 运行结果 如何让mybatis-plus的逻辑删除注解TableLogic临时失效 1. 场…...

基于单片机的智能窗帘系统设计

摘要: 介绍了一种智能窗帘系统,该系统由单片机STC89C52 为控制核心,光照控制电路采用光敏电阻和ADC0832 芯片,步进电机驱动电路采用ULN2003 芯片,以达到不同光照强度下窗帘的自动启闭。仿真和实物结果显示,该系统实用性强,应用范围广,具有很好的应用前景。 关键词: 单片…...

代码随想录 Day17 字符串 | LC344 反转字符串 LC541 反转字符串II 卡码网54替换数字

一、反转字符串 题目&#xff1a; 力扣344&#xff1a;反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题…...

LeetCode 刷题汇总——题目序号顺序版

剑指 Offer——和为 S 的两个数字 剑指 Offer——数字在排序数组中出现的次数 剑指 Offer——和为 S 的连续正数序列 剑指 Offer——最小的 K 个数 剑指 Offer——连续子数组的最大和 剑指 Offer——数组中的逆序对 LeetCode 1——两数之和 LeetCode 2——两数相加 LeetCode 3…...

【Java】JDK1.8 HashMap源码,put源码详细讲解

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 在Java中&#xff0c;HashMap结构是被经常使用的&#xff0c;在面试当中也是经常会被问到的。这篇文章我给大家分享一下我对于HashMap结构源码的理解。 HashMap的存储与一般的数组不同&#xff0c;HashMap的每一个元素存…...

自定义注解进行数据转换

前言&#xff1a; Java注解是一种元数据机制&#xff0c;可用于方法&#xff0c;字段&#xff0c;类等程序上以提供关于这些元素的额外信息。 以下内容是我自己写的一个小测试的demo,参考该文章进行编写&#xff1a;https://blog.csdn.net/m0_71621983/article/details/1318164…...

React - 你知道在React组件的哪个阶段发送Ajax最合适吗

难度级别:中级及以上 提问概率:65% 如果求职者被问到了这个问题,那么只是单纯的回答在哪个阶段发送Ajax请求恐怕是不够全面的。最好是先详细描述React组件都有哪些生命周期,最后再回过头来点题作答,为什么应该在这个阶段发送Ajax请求。那…...

spa、vue、elementUi

spa (single page application). 动态重写当前页面而非从服务器重新加载整个新页面。使应用程序更像一个桌面应用程序。所有的html、javascript、css通过单个页面检索加载资源。前端页面使用ajax与后端通信。一个项目只有一个html页面。所有的页面跳转都通过路由导航。 vue可用…...

tcp接受命令执行并回显

为了实现循环执行命令并能够多次从TCP客户端接收命令&#xff0c;您需要对上面的代码进行一些修改。下面是一个修改后的示例&#xff0c;它将在接收到新的TCP连接后进入一个循环&#xff0c;不断地读取命令、执行命令&#xff0c;并将结果发送回客户端&#xff0c;直到客户端断…...

LLMs之ToolAlpaca:ToolAlpaca(通用工具学习框架/工具使用语料库)的简介、安装和使用方法、案例应用之详细攻略

LLMs之ToolAlpaca&#xff1a;ToolAlpaca(通用工具学习框架/工具使用语料库)的简介、安装和使用方法、案例应用之详细攻略 目录 ToolAlpaca的简介 0、《ToolAlpaca: Generalized Tool Learning for Language Models with 3000 Simulated Cases》翻译与解读 1、数据集列表 2…...

TCP/IP协议介绍

TCP/IP协议 先看&#xff1a;程序员必备基础知识-TCP/IP协议详解.(超详细&#xff09; 太厉害了&#xff0c;终于有人能把TCP/IP协议讲的明明白白了&#xff01; 面试官&#xff1a;如何理解TCP/IP协议? 一个很全的介绍博客&#xff1a;史上最全的TCP/IP协议原理 对TCP三次握…...

选择排序解读

在计算机科学中&#xff0c;排序算法是一种将数据元素按照某种顺序排列的算法。今天&#xff0c;我们要探讨的是选择排序&#xff08;Selection Sort&#xff09;&#xff0c;这是一种简单直观的排序方法&#xff0c;通过不断选择剩余元素中的最小&#xff08;或最大&#xff0…...

Vue项目自动注入less、sass、scss、stylus全局变量

一、Vue2项目 // vue.config.js const path require(path) module.exports {css: {loaderOptions: {// 给 sass-loader 传递选项sass: {// / 是 src/ 的别名// 所以这里假设有 src/assets/style/var.sass 这个文件// 注意&#xff1a;在 sass-loader v8 中&#xff0c;这个选…...

DXP学习002-PCB编辑器的环境参数及电路板参数相关设置

目录 一&#xff0c;dxp的pcb编辑器环境 1&#xff0c;创建新的PCB设计文档 2&#xff0c;PCB编辑器界面 1&#xff09;布线工具栏 2&#xff09;公用工具栏 3&#xff09;层标签栏 ​编辑 3&#xff0c;PCB设计面板 1&#xff09;打开pcb设计面板 4&#xff0c;PCB观…...

Flutter 使用flutter_swiper_null_safety 实现轮播图

目录 引入flutter_swiper_null_safety 在pubspec.yaml文件中dependencies下添加以下依赖 然后执行命令进行下载 实现轮播图 引入flutter_swiper_null_safety 在pubspec.yaml文件中dependencies下添加以下依赖 flutter_swiper_null_safety: ^1.0.2 然后执行命令进行下载 flu…...

Maven的scope详解

依赖范围介绍 maven 项目不同的阶段引入到classpath中的依赖是不同的&#xff0c;例如&#xff0c;编译时&#xff0c;maven 会将与编译相关的依赖引入classpath中&#xff0c;测试时&#xff0c;maven会将测试相关的的依赖引入到classpath中&#xff0c;运行时&#xff0c;mav…...

如何修复在Deepin系统中因`apt-get autoremove systemd`导致的启动问题

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …...

LeetCode 每日一题 ---- 【2923. 找到冠军 I】

LeetCode 每日一题 ---- 【2923. 找到冠军 I】 2923.找到冠军I方法一&#xff1a;暴力求解 2923.找到冠军I 方法一&#xff1a;暴力求解 从头遍历一遍二维数组&#xff0c;如果发现 gird[x][y] 1&#xff0c;说明 x 队赢过 y 队&#xff0c;下面我们就只需要子再判断一下是否…...

CMakeLists常用命令

# 设置cmake最低版本 cmake_minimum_required(VERSION 3.2)# project命令用于指定cmake工程的名称&#xff0c;实际上&#xff0c;它还可以指定cmake工程的版本号&#xff08;VERSION关键字&#xff09;、 #简短的描述&#xff08;DESCRIPTION关键字&#xff09;、主页URL&…...

英语 倒装结构中的主语和助动词,用于强调 inversion

I am used to travelling by air and only on one occasion have I ever felt frightened. 1、翻译为中文&#xff1a;我习惯了乘坐飞机旅行&#xff0c;只有在一次经历中我感到过害怕。 2、分析时态和句子语法是否正确&#xff1a;该句子使用了现在完成时&#xff08;I am u…...

Azure流分析快速入门:构建实时数据处理管道的完整指南 [特殊字符]

Azure流分析快速入门&#xff1a;构建实时数据处理管道的完整指南 &#x1f680; 【免费下载链接】azure-quickstart-templates Azure Quickstart Templates 项目地址: https://gitcode.com/gh_mirrors/az/azure-quickstart-templates Azure流分析是微软提供的实时数据分…...

同样遍历 Mat,为什么你的代码慢 10 倍?

文章目录前言一、什么是不连续Mat&#xff1f;1.产生不连续内存的常见场景2.连续与不连续内存本质区别二、常见错误遍历方式&踩坑分析1.错误一:at<>()逐像素访问&#xff08;速度慢&#xff09;2.错误二&#xff1a;强行使用一维 data 指针&#xff08;高危崩溃&…...

从经典工程恶作剧看理论派与实践派的思维碰撞与团队协作

1. 项目概述&#xff1a;一场经典的工程恶作剧及其启示在任何一个技术团队里&#xff0c;总有一些故事会口口相传&#xff0c;成为团队文化的一部分。我今天想分享的这个故事&#xff0c;发生在上世纪80年代初&#xff0c;一个微电路设计小组里。它无关乎高深的技术突破&#x…...

MCP协议实战:用mcp-custom-dev构建AI助手专属工具链

1. 项目概述&#xff1a;一个为开发者赋能的MCP自定义开发工具最近在和一些做AI应用开发的朋友聊天&#xff0c;发现大家普遍遇到一个痛点&#xff1a;虽然现在大语言模型&#xff08;LLM&#xff09;的API调用很方便&#xff0c;但想把它们真正“嵌入”到自己的业务流程里&…...

Nature论文检索正在失效,Perplexity底层检索逻辑重构预警(仅限科研骨干内部流通的3条技术简报)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Nature论文检索正在失效&#xff0c;Perplexity底层检索逻辑重构预警&#xff08;仅限科研骨干内部流通的3条技术简报&#xff09; 检索信号衰减的实证观测 近期对Nature、Science主站及PubMed Centra…...

AI技能统一管理:用Obsidian插件Agentfiles构建你的智能编码中枢

1. 项目概述&#xff1a;一个为AI编码时代打造的技能中枢 如果你和我一样&#xff0c;日常开发工作流里已经塞满了各种AI编码助手——Claude Code、Cursor、Codex、Windsurf……那么你一定也面临过同样的困境&#xff1a;每个工具都有自己的一套“技能”或“记忆”系统&#xf…...

WarcraftHelper魔兽争霸III优化工具:让你的经典游戏重获新生

WarcraftHelper魔兽争霸III优化工具&#xff1a;让你的经典游戏重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为《魔兽争霸III》…...

C++数据结构进阶|排序:吃透O(n log n)核心算法,搞定面试高频考点

文章目录 前言 一、希尔排序&#xff08;Shell Sort&#xff09;—— 插入排序的进阶优化版 二、快速排序&#xff08;Quick Sort&#xff09;—— C面试手写高频&#xff0c;实际开发首选 三、归并排序&#xff08;Merge Sort&#xff09;—— 稳定排序的核心选择 四、堆排…...

欢迎来到Marp世界

欢迎来到Marp世界 【免费下载链接】marp The entrance repository of Markdown presentation ecosystem 项目地址: https://gitcode.com/gh_mirrors/mar/marp 用Markdown创建专业演示文稿从未如此简单&#xff01; 第二张幻灯片 列表项1列表项2列表项3 第三张幻灯片&am…...

多目标粒子群混合储能优化配置【附算法】

✨ 长期致力于混合储能、优化配置、风光互补微电网、多目标粒子群算法、CRITIC-TOPSIS研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;风光-负荷多场景…...