目录
- 一. 🦁 写在前面
- 二. 🦁 探索过程
- 三. 🦁 原理解释
- 四. 🦁 最后

一. 🦁 写在前面
如题所言,很难受!!!
原因是 🦁 在写项目的时候,使用 MybatisPlus(为图方便,后面直接叫MP) 碰到一个奇怪的BUG
,但是系统没报错,并且运行成功了!那就是我在写管理员后台的时候,测试修改密码这个功能,改了一下目前登录的管理员的密码(由123456——>123),由于密码是加密存储的(使用的是 SpringSecurity 自带的加密),我也没多留意数据库是否修改成功!也没看 IDEA 控制台的打印信息,自信地以为已经测试好了!
N 年过去了… … …~惨遭打脸
!!!
二. 🦁 探索过程
因为某些原因重启项目!登录的时候发现输入密码错误:
这会我不自信了!为啥会这样嘞?我记得我上次改了密码了呀?难道我没改?(现在想想笑死了!) 于是我又使用以前的密码登录!
没想到登录成功了。。。
我就纳闷了,为啥这个密码会修改失灵呢?
重新测试一次,显示操作成功!直接看控制台,发现数据库更新条数为0 。。。
我直接去看了一下我的逻辑!发现没问题呀,这个操作又不难!但是由于这个是单表操作,我直接调用 MP 的 api —— updateById()实现的。难道是这个api有毛病?于是我半信半疑将这个方法换成:
public abstract int update(
@Param("et") T entity,
@Param("ew") com.baomidou.mybatisplus.core.conditions.Wrapper<T> updateWrapper
)
修改成功!无疑就是 updateById() 有问题!
就很好奇为啥会这样?
三. 🦁 原理解释
查资料,看官网!
发现这个 BUG 是 MyBatis-Plus 对字段的验证策略导致的,MyBatis-Plus默认进行了不是全量更新的策略:
mybatis-plus:
global-config:
#字段策略 0: 忽略判断 1:非 NULL 判断 2: 非空判断
field-strategy: 1
默认情况下,该字段的验证策略为1,即不能为空(NOT NULL)。在进行更新操作时,会进行空值判断,并默认不更新为null的传参。
而 🦁 数据库的表有个创建时间和更新时间的字段,在更新时,并没有考虑到这个字段的更新,参数就会有一个为 null,最后更新失效了!
四. 🦁 最后
又又遇到一个小BUG,记录一下!希望能帮助到屏幕前的你!
🦁 其它优质专栏推荐 🦁
🌟《Java核心系列(修炼内功,无上心法)》: 主要是JDK源码的核心讲解,几乎每篇文章都过万字,让你详细掌握每一个知识点!
🌟 《springBoot 源码剥析核心系列》:一些场景的Springboot源码剥析以及常用Springboot相关知识点解读
欢迎加入狮子的社区:『Lion-编程进阶之路』,日常收录优质好文
更多文章可持续关注上方🦁的博客,2024咱们顶峰相见!