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

这篇具有很好参考价值的文章主要介绍了2. 如何让mybatis-plus的逻辑删除注解@TableLogic临时失效。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如何让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 {
    @TableId
    private String id;
    private String name;
    @TableLogic
    private 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

数据库数据记录为:
2. 如何让mybatis-plus的逻辑删除注解@TableLogic临时失效,36. 付费专栏,mybatis,逻辑删除,TableLogic,逻辑删除注解,临时失效,暂时失效
接口调用结果为

[{"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();
    
    @Override
    public 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();
    }
    
    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public 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的小李也被查询出来了文章来源地址https://www.toymoban.com/news/detail-849125.html

到了这里,关于2. 如何让mybatis-plus的逻辑删除注解@TableLogic临时失效的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Mybatis-Plus】常见的@table类注解

    目录 引入Mybatis-Plus依赖 @TableName 当实体类的类名在转成小写后和数据库表名相同时 当实体类的类名在转成小写后和数据库表名不相同时 @Tableld @TableField 当数据库字段名与实体类成员不一致 成员变量名以is开头,且是布尔值  ​编辑 成员变量名与数据库冲突的时候 成

    2024年02月06日
    浏览(42)
  • 使用lombok注解导致mybatis-plus TypeHandler失效

    建立实体其中一个字段为枚举类 希望数据库存的时对应的数字 为了和数据库进行转换,使用了typeHandler 测试发现 插入/更新typeHandler生效,但是查询时在将数据库数据映射成java实体类的时候报错 设置的HotEventCreationMethodHandler并没有生效 我们知道,在不开启autoResultMap时,会导

    2024年02月07日
    浏览(46)
  • MyBatis-Plus 超详细笔记|配置使用|多种查询|常用注解

    Mybatis-Plus可以节省大量时间,所有的CRUD代码都可以自动化完成。 MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。其在 MyBatis 的基础上提供了很多方便的 CRUD 操作、分页查询、逻辑删除、自动填充等功能。 在Maven项目中,

    2024年02月05日
    浏览(48)
  • mybatis-plus 根据指定字段 批量 删除/修改

    mybatis-plus 提供了根据id批量更新和修改的方法,这个大家都不陌生 但是当表没有id的时候怎么办) 这个就不说了,就是因为不想手写SQL 所以才有这篇博客 mybatis plus 的 executeBatch 参考 mybatis plus 的updateBatchById 方法. 调用处: 接口 重写方法 实现 这种写法其实批量的效率还是比较慢的

    2024年02月13日
    浏览(41)
  • 乌龙!mybatis-plus的@TableId注解不生效,原来竟是因为它!

    大家觉得下面的sql返回什么?   答案: 无返回。因为 null=1 是个false的表达式。这就像我们写 where 1=2 一样。   本次迭代的需求开发完成,将开发分支merge到test分支,部署测试环境提测后,QA提了一个bug,附下面log截图。 通过logtrace排查程序,定位到如下代码。代码很简单,

    2024年02月05日
    浏览(34)
  • MyBatis Plus 逻辑删除

    何为逻辑删除 删除数据,可以通过物理删除,也可以通过逻辑删除。 物理删除指的是直接将数据从数据库中删除,不保留。 逻辑删除指的是修改数据的某个字段,使其表示为已删除状态,而非删除数据,保留该数据在数据库中,但是查询时不显示该数据(查询时过滤掉该数

    2024年02月02日
    浏览(37)
  • SpringBoot+MyBatis-Plus多数据源@DS注解失效的解决方法

    引入 dynamic-datasource: application.yml 数据源配置: 详细使用请看 MyBatis-Plus官网 这种场景还是比较常见,比如在一个为master数据源的调用slave数据源就会失效 slave数据源Service方法 mater数据源Service方法调用slave数据源Service方法 这里会出现没有走slave_1,依然还是master数据源 需要在

    2024年01月18日
    浏览(53)
  • 在mybatis-plus项目中自带要编写sql语句,@select注解的使用

    提示:在mybatisplus中编写sql语句有两种方法,我重点使用@select注释这种方法,还有一种是增加mapper.xml文件配置,这里不做讲解 现在mybatis-plus中已经封装了绝大部分简单sql,只用一部分负责sql需要自行编写,所以用@select的方式可以减少开发量,减少项目的复杂性。 @select是myb

    2023年04月12日
    浏览(51)
  • Mybatis plus中的逻辑删除源码跟踪

    网上搜了一堆文章,都没有贴出源码: 疑问: 逻辑删除,delete和select到底是在哪改变的sql??? 一、跟踪方法——DeleteById 说明: 逻辑删除,实质用的update语句; 组装逻辑删除字段: 逻辑删除的sql(实质都是update): 至此大改已经清楚了!~ 二、跟踪方法——selectList 类似

    2024年02月08日
    浏览(57)
  • MyBatis-Plus条件构造器[常用的模糊查询、排序查询、逻辑查询和指定字段查询案例]

    Mybatis-Plus知识点[MyBatis+MyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客  Mybatis-Plus+SpringBoot结合运用_心态还需努力呀的博客-CSDN博客 MyBaits-Plus中@TableField和@TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus中的更新操作(通过id更新和条件更新)_心态还需努力呀的博客

    2024年02月06日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包