我们在使用mybatis-plus时,一般设备逻辑删除是非常简单的,基本上在yaml等配置文件中做一下配置。然后在字段上注解@TableLogic就可以了。有不清楚的,可以参考https://www.xiangcaowuyu.net/java/mybatis-plus-logical-deletion.html
但是今天在项目中,发现一个问题,就是明明也正确的进行了配置,但是在进行数据库操作时,发现逻辑删除并没有生效。

问题描述

先说一下问题先想,数据库指定的字段可以使用,但是指定是否逻辑删除的值时还是mybatis-plus默认的01,并不是我指定的NY

配置文件

先来看下我的配置文件。

  1. mybatisPlus:
  2. # 搜索指定包别名
  3. typeAliasesPackage: net.xiangcaowuyu.**.domain
  4. # 加载全局的配置文件
  5. configLocation: classpath:mybatis/mybatis-config.xml
  6. global-config:
  7. db-config:
  8. # 配置逻辑删除
  9. logic-delete-field: del_flag
  10. logic-not-delete-value: N
  11. logic-delete-value: Y

通过配置文件,我指定数据库标记逻辑删除的字段为del_flag,如果已经删除,标记为Y,如果没有删除(默认值)就是N

实体

通过提取的公共实体,标记逻辑删除字段,如下

  1. @Data
  2. public class BaseEntity implements Serializable {
  3. private static final long serialVersionUID = 1L;
  4. /**
  5. * 搜索值
  6. */
  7. private String searchValue;
  8. /**
  9. * 创建者
  10. */
  11. @TableField(fill = FieldFill.INSERT)
  12. private Long createBy;
  13. /**
  14. * 创建时间
  15. */
  16. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  17. @TableField(fill = FieldFill.INSERT)
  18. private Date createTime;
  19. /**
  20. * 更新者
  21. */
  22. @TableField(fill = FieldFill.UPDATE)
  23. private Long updateBy;
  24. /**
  25. * 更新时间
  26. */
  27. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  28. @TableField(fill = FieldFill.UPDATE)
  29. private Date updateTime;
  30. /**
  31. * 删除标志(Y-已删除,N-未删除)
  32. */
  33. @TableLogic
  34. private String delFlag;
  35. /**
  36. * 开始时间
  37. */
  38. @JsonIgnore
  39. @TableField(exist = false)
  40. private String beginTime;
  41. /**
  42. * 结束时间
  43. */
  44. @JsonIgnore
  45. @TableField(exist = false)
  46. private String endTime;
  47. }

使用

调用了一个update方法

  1. postMapper.updatePost(post);

在进行更新操作时,mybatis-plus会追加where条件防止更新到已删除数据,且使用wrapper.entity生成的where条件会忽略该字段。也就是说,我本来的方法对应的sql可能是

  1. update xx set xx where xx=xx

如果我配置的逻辑删除没有问题的话,mybatis-plus生成的sql应该是

  1. update xx set xx where xx=xx and del_flag = 'N'

但是实际我测试发现,生成的sql却是

  1. update xx set xx where xx=xx and del_flag = '0'

可以看到,虽然逻辑删除的字段是对的,但是实际上,对应字段是否删除的值还是mybatis-plus默认的,并不是我们设置的。

问题分析

其实这个问题之前还是好的,让我想到应该是最近配置的SqlSessionFactory的问题。

  1. @Bean
  2. public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
  3. String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage");
  4. String mapperLocations = env.getProperty("mybatis-plus.mapperLocations");
  5. String configLocation = env.getProperty("mybatis-plus.configLocation");
  6. typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
  7. VFS.addImplClass(SpringBootVFS.class);
  8. final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean ();
  9. sessionFactory.setDataSource(dataSource);
  10. sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
  11. sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
  12. sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
  13. sessionFactory.setPlugins(mybatisSqlInterceptor(),mybatisPlusInterceptor());
  14. return sessionFactory.getObject();
  15. }

我这里重新注入了MybatisSqlSessionFactoryBean,但是并没有对它的配置进行修改,这就导致了我配置文件里的东西并没有加载。

解决

解决办法也很简单,两种方式我们分别说下。

方式一

方式一是在我们实体逻辑删除的注解上加上删除和未删除对应的值。

  1. /**
  2. * 删除标志(Y-已删除,N-未删除)
  3. */
  4. @TableLogic(value = "N",delval = "Y")
  5. private String delFlag;

方式二

方式二就是,我们在MybatisSqlSessionFactoryBeanbean里,把我们配置文件里的配置加上。对SqlSessionFactory改造如下

  1. @Bean
  2. public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
  3. String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage");
  4. String mapperLocations = env.getProperty("mybatis-plus.mapperLocations");
  5. String configLocation = env.getProperty("mybatis-plus.configLocation");
  6. typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
  7. VFS.addImplClass(SpringBootVFS.class);
  8. final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean ();
  9. sessionFactory.setDataSource(dataSource);
  10. sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
  11. sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
  12. sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
  13. sessionFactory.setPlugins(mybatisSqlInterceptor(),mybatisPlusInterceptor());
  14. sessionFactory.setGlobalConfig(globalConfig());
  15. return sessionFactory.getObject();
  16. }
  17. @Bean
  18. public MybatisSqlInterceptor mybatisSqlInterceptor() {
  19. MybatisSqlInterceptor mybatisSqlInterceptor = new MybatisSqlInterceptor();
  20. Properties properties = new Properties();
  21. mybatisSqlInterceptor.setProperties(properties);
  22. return mybatisSqlInterceptor;
  23. }
  24. /**
  25. * 逻辑删除插件
  26. */
  27. @Bean
  28. public GlobalConfig globalConfig() {
  29. GlobalConfig globalConfig = new GlobalConfig();
  30. GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
  31. dbConfig.setLogicDeleteValue("Y");
  32. dbConfig.setLogicNotDeleteValue("N");
  33. globalConfig.setDbConfig(dbConfig);
  34. return globalConfig;
  35. }

mybatis-plus逻辑删除不生效的解决办法的更多相关文章

  1. Git忽略规则及.gitignore规则不生效的解决办法

    在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规则例如: # 此为注 ...

  2. .gitignore规则不生效的解决办法

    .gitignore规则不生效的解决办法 使用git 的时候,在.gitignore中已经添加了某个文件或者文件夹,但是使用git status还能看见该文件的修改提示--–说明.gitignore未 ...

  3. Git忽略规则和.gitignore规则不生效的解决办法

    Git忽略规则和.gitignore规则不生效的解决办法   Git忽略规则: 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如果 ...

  4. 【转载】Git忽略规则和.gitignore规则不生效的解决办法

    原文:https://www.cnblogs.com/zhangxiaoliu/p/6008038.html Git忽略规则: 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 ...

  5. discuz论坛后台部分设置更改之后,清除了缓存网站前台不更新不生效的解决办法

    discuz论坛后台部分设置更改之后,清除了缓存但网站前台不更新不生效的解决办法 在config/config_global.php  把  $_config['memory']['eaccelera ...

  6. 微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法

    微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法 具体情况: scroll-view 滚动,设置 display:flex 不生效并警告设置 enable-fl ...

  7. git忽略文件夹提交以及gitignore修改后不生效的解决办法

    1.在 .gitgnore 文件加入需要忽略的问价夹正则表达式: 在配置完以后提交代码,你可能会发现git忽略配置不生效! 解决办法,将缓存的文件重新添加一下即可 2.打开命令行,将下面三个命令复制粘 ...

  8. 本地修改js代码并时时生效的解决办法

    js作为客户端语言(当然它也可以作服务端语言),非常强悍,一般情况下,我们都是在开发阶段不停的改,然后上线之后就作为稳定运行的代码. 然而有时候可能因为js写得有问题,导致上线后,某些功能无法使用,这 ...

  9. 配置java环境变量后没有生效的解决办法

    参考文章:https://blog.csdn.net/tooky_poom/article/details/60768458 系统安装了jdk1.7,环境变量正常,但是安装jdk1.8后,修改环境变量 ...

  10. weblogic下更改jsp不生效的解决办法

    1.删除user_projects\domains\base_domain(我自己的域名)\servers\AdminServer目录下的所有文件夹 一下为转载from:http://blog.itp ...

随机推荐

  1. Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解

    本篇借鉴了这篇文章,如果有兴趣,大家可以看看:https://blog.csdn.net/geter_CS/article/details/84857220 1.交叉熵:交叉熵主要是用来判定实际的输出 ...

  2. vue 中 slot 的使用方式,以及作用域插槽的用法

    分类:插槽又分为匿名插槽.具名插槽以及作用域插槽 : 匿名插槽,我们又可以叫它单个插槽或者默认插槽 因为组件标签中间是不允许写内容的,但是可以插入 插槽 :template 标签 : 插槽的使用方法 ...

  3. Android复习(二)应用资源——>可绘制对象资源

    可绘制对象资源是图形的一般概念,是指可在屏幕上绘制的图形,以及可使用 getDrawable(int) 等 API 检索,或应用到拥有 android:drawable 和 android:icon  ...

  4. 下一代云电脑技术来临,为什么PC Farm才是未来,以ToDesk为例

    近年来飞速发展的云电脑技术,正在挤压传统电脑的生存空间.由于用户对电脑计算能力的要求日益增高,而传统电脑往往会受限于硬件性能无法更新,更换花费较高等因素,难以满足用户对高性能电脑的期待. 与此同时,下 ...

  5. 蓝屏攻击 MS12-020

    目录 1.蓝屏攻击 MS12-020 搜索对应活跃主机win7蓝屏漏洞端口 Nessus 执行漏洞扫描 Metasploit 漏洞利用 msfconsole Armitage 1.蓝屏攻击 MS12- ...

  6. BeanStalkd 做队列服务

    今天无意间看到这个仓库讲php关于 BeanStalkd 的扩展,然后就去了解了一下beanstalkd,才知道它可以用来做队列服务. 话不多说,安装一下试试. 首先 sudo apt search ...

  7. SyntaxError: non-default argument follows default argument

    有时候没注意就会犯一些低级错误 问题原因 把没有默认值的形参放到了带有默认值的形参后面 解决办法 问了一下chatgpt,果然一语道破.因为python在定义函数时,在不定长参数中,默认值参数不能放在 ...

  8. Docker容器内服务自启动解决方案

    背景 在很多场景下,我们需要拉取或者是使用的别人的容器,但是有些容器内部的服务并不能自启动,比如Apache服务.mysql服务等等,对于数量较少的容器来讲,我们可以进入容器中使用命令将服务进行启动, ...

  9. JConsole 远程监控Tomcat服务

    JConsole 远程监控Tomcat服务 1.概述 JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动.如果要把一个应用以可管理的形式启动, ...

  10. Maven多模块项目 eclipse热部署 Maven项目实现 tomcat热部署

    Maven 多模块项目在eclipse下面热部署,即你可以体验下无论你修改整个项目里面的任何模块的代码,都不需要用maven打包就可以看到效果, 1.首先准备好创建一个maven多项目的代码,准备好一 ...