mybatis-plus逻辑删除不生效的解决办法
我们在使用mybatis-plus时,一般设备逻辑删除是非常简单的,基本上在yaml等配置文件中做一下配置。然后在字段上注解@TableLogic就可以了。有不清楚的,可以参考https://www.xiangcaowuyu.net/java/mybatis-plus-logical-deletion.html
但是今天在项目中,发现一个问题,就是明明也正确的进行了配置,但是在进行数据库操作时,发现逻辑删除并没有生效。
问题描述
先说一下问题先想,数据库指定的字段可以使用,但是指定是否逻辑删除的值时还是mybatis-plus默认的0和1,并不是我指定的N和Y。
配置文件
先来看下我的配置文件。
- mybatisPlus:
- # 搜索指定包别名
- typeAliasesPackage: net.xiangcaowuyu.**.domain
- # 加载全局的配置文件
- configLocation: classpath:mybatis/mybatis-config.xml
- global-config:
- db-config:
- # 配置逻辑删除
- logic-delete-field: del_flag
- logic-not-delete-value: N
- logic-delete-value: Y
通过配置文件,我指定数据库标记逻辑删除的字段为del_flag,如果已经删除,标记为Y,如果没有删除(默认值)就是N。
实体
通过提取的公共实体,标记逻辑删除字段,如下
- @Data
- public class BaseEntity implements Serializable {
- private static final long serialVersionUID = 1L;
- /**
- * 搜索值
- */
- private String searchValue;
- /**
- * 创建者
- */
- @TableField(fill = FieldFill.INSERT)
- private Long createBy;
- /**
- * 创建时间
- */
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- @TableField(fill = FieldFill.INSERT)
- private Date createTime;
- /**
- * 更新者
- */
- @TableField(fill = FieldFill.UPDATE)
- private Long updateBy;
- /**
- * 更新时间
- */
- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
- @TableField(fill = FieldFill.UPDATE)
- private Date updateTime;
- /**
- * 删除标志(Y-已删除,N-未删除)
- */
- @TableLogic
- private String delFlag;
- /**
- * 开始时间
- */
- @JsonIgnore
- @TableField(exist = false)
- private String beginTime;
- /**
- * 结束时间
- */
- @JsonIgnore
- @TableField(exist = false)
- private String endTime;
- }
使用
调用了一个update方法
- postMapper.updatePost(post);
在进行更新操作时,mybatis-plus会追加where条件防止更新到已删除数据,且使用wrapper.entity生成的where条件会忽略该字段。也就是说,我本来的方法对应的sql可能是
- update xx set xx where xx=xx
如果我配置的逻辑删除没有问题的话,mybatis-plus生成的sql应该是
- update xx set xx where xx=xx and del_flag = 'N'
但是实际我测试发现,生成的sql却是
- update xx set xx where xx=xx and del_flag = '0'
可以看到,虽然逻辑删除的字段是对的,但是实际上,对应字段是否删除的值还是mybatis-plus默认的,并不是我们设置的。
问题分析
其实这个问题之前还是好的,让我想到应该是最近配置的SqlSessionFactory的问题。
- @Bean
- public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
- String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage");
- String mapperLocations = env.getProperty("mybatis-plus.mapperLocations");
- String configLocation = env.getProperty("mybatis-plus.configLocation");
- typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
- VFS.addImplClass(SpringBootVFS.class);
- final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean ();
- sessionFactory.setDataSource(dataSource);
- sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
- sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
- sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
- sessionFactory.setPlugins(mybatisSqlInterceptor(),mybatisPlusInterceptor());
- return sessionFactory.getObject();
- }
我这里重新注入了MybatisSqlSessionFactoryBean,但是并没有对它的配置进行修改,这就导致了我配置文件里的东西并没有加载。
解决
解决办法也很简单,两种方式我们分别说下。
方式一
方式一是在我们实体逻辑删除的注解上加上删除和未删除对应的值。
- /**
- * 删除标志(Y-已删除,N-未删除)
- */
- @TableLogic(value = "N",delval = "Y")
- private String delFlag;
方式二
方式二就是,我们在MybatisSqlSessionFactoryBean的bean里,把我们配置文件里的配置加上。对SqlSessionFactory改造如下
- @Bean
- public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
- String typeAliasesPackage = env.getProperty("mybatis-plus.typeAliasesPackage");
- String mapperLocations = env.getProperty("mybatis-plus.mapperLocations");
- String configLocation = env.getProperty("mybatis-plus.configLocation");
- typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
- VFS.addImplClass(SpringBootVFS.class);
- final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean ();
- sessionFactory.setDataSource(dataSource);
- sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
- sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
- sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));
- sessionFactory.setPlugins(mybatisSqlInterceptor(),mybatisPlusInterceptor());
- sessionFactory.setGlobalConfig(globalConfig());
- return sessionFactory.getObject();
- }
- @Bean
- public MybatisSqlInterceptor mybatisSqlInterceptor() {
- MybatisSqlInterceptor mybatisSqlInterceptor = new MybatisSqlInterceptor();
- Properties properties = new Properties();
- mybatisSqlInterceptor.setProperties(properties);
- return mybatisSqlInterceptor;
- }
- /**
- * 逻辑删除插件
- */
- @Bean
- public GlobalConfig globalConfig() {
- GlobalConfig globalConfig = new GlobalConfig();
- GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
- dbConfig.setLogicDeleteValue("Y");
- dbConfig.setLogicNotDeleteValue("N");
- globalConfig.setDbConfig(dbConfig);
- return globalConfig;
- }
mybatis-plus逻辑删除不生效的解决办法的更多相关文章
- Git忽略规则及.gitignore规则不生效的解决办法
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件).这个文件每一行保存了一个匹配的规则例如: # 此为注 ...
- .gitignore规则不生效的解决办法
.gitignore规则不生效的解决办法 使用git 的时候,在.gitignore中已经添加了某个文件或者文件夹,但是使用git status还能看见该文件的修改提示--–说明.gitignore未 ...
- Git忽略规则和.gitignore规则不生效的解决办法
Git忽略规则和.gitignore规则不生效的解决办法 Git忽略规则: 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如果 ...
- 【转载】Git忽略规则和.gitignore规则不生效的解决办法
原文:https://www.cnblogs.com/zhangxiaoliu/p/6008038.html Git忽略规则: 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 ...
- discuz论坛后台部分设置更改之后,清除了缓存网站前台不更新不生效的解决办法
discuz论坛后台部分设置更改之后,清除了缓存但网站前台不更新不生效的解决办法 在config/config_global.php 把 $_config['memory']['eaccelera ...
- 微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法
微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法 具体情况: scroll-view 滚动,设置 display:flex 不生效并警告设置 enable-fl ...
- git忽略文件夹提交以及gitignore修改后不生效的解决办法
1.在 .gitgnore 文件加入需要忽略的问价夹正则表达式: 在配置完以后提交代码,你可能会发现git忽略配置不生效! 解决办法,将缓存的文件重新添加一下即可 2.打开命令行,将下面三个命令复制粘 ...
- 本地修改js代码并时时生效的解决办法
js作为客户端语言(当然它也可以作服务端语言),非常强悍,一般情况下,我们都是在开发阶段不停的改,然后上线之后就作为稳定运行的代码. 然而有时候可能因为js写得有问题,导致上线后,某些功能无法使用,这 ...
- 配置java环境变量后没有生效的解决办法
参考文章:https://blog.csdn.net/tooky_poom/article/details/60768458 系统安装了jdk1.7,环境变量正常,但是安装jdk1.8后,修改环境变量 ...
- weblogic下更改jsp不生效的解决办法
1.删除user_projects\domains\base_domain(我自己的域名)\servers\AdminServer目录下的所有文件夹 一下为转载from:http://blog.itp ...
随机推荐
- PasteForm最佳CRUD实践,实际案例PasteTemplate详解之3000问(四)
无论100个表还是30个表,在使用PasteForm模式的时候,管理端的页面是一样的,大概4个页面, 利用不同操作模式下的不同dto数据模型,通过后端修改对应的dto可以做到控制前端的UI,在没有特别 ...
- Failed to connect to github.com port 443: Connection refused问题解决
解决办法: 1.找到github的ip地址:查找链接 2.找到本地的hosts文件.我的hosts文件路劲为:C:\Windows\System32\drivers\etc 3.在hosts文件最后添 ...
- Oracle数据库安装配置详细教程汇总(含11g、12c、18c、19c、21c)
不论你是数据库小白,还是久经沙场的技术专家,你接触和运维Oracle数据库的第一步可能都是安装配置.并且随着软硬件的升级.替换以及业务场景的变化,数据库安装也将是你常常会进行的操作之一. 这里先为大家 ...
- Putty 远程 连接kali Linux拒绝访问 refused connection
1. 设置 ssh 文件 crtl + alt + t 代开终端 输入命令: vim /etc/ssh/sshd_config 说明 : 使用 vim 编辑器编辑 ssh 文件 : 说明: 修改第3 ...
- KubeSphere 社区双周报|2024.06.07-06.20
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- KubeSphere 社区双周报|2024.02.29-03.14
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- 网页设计中常用的Web英文安全字体
原文地址:https://www.openkee.com/post-176.html 在 Web 编码中,CSS 默认应用的 Web 字体是有限的,你能看到的字体别人未必看得到.虽然在新版本的CSS3 ...
- 玩黑悟空要配什么显卡?ToDesk云电脑一招搞定!
近期国产游戏大作<黑神话·悟空>的预售开启,许多玩家对于如何配置自己的电脑以畅玩这款画质卓越.支持全景光追的3A大作产生了浓厚的兴趣. 尤其是显卡的选择,成为了玩家们关注的焦点.<黑 ...
- Protues中51单片机按键无法复位(已解决)
前言 昨晚用 Protues 搭建了 51 的最小系统电路,在实物中好用的复位电路,到仿真里不能正常复位了. 51 单片机是高电平复位,所以在运行时 RST 引脚应该是低电平,但在仿真中 RST 引脚 ...
- 洛谷 P1540 [NOIP2010 提高组] 机器翻译
题目概括 给定 N 个整数,和一个容量为 M 的"字典",从头到尾依次翻译,每次翻译先看自家字典,没有的话再看别人的字典并存到自家字典,如果自家字典满了,当前单词的翻译会代替最早进 ...