MyBatis Plus的“幻查” 规范到底要怎样使用哪几个查询函数 为什么会出现幻查?还有幻删为什么会删不掉
先来解释一下 幻查和幻删 不知道前人有没有提及这样的概念 就是 他提示查询成功了 能够根据id查到对应的数据了
但是有一天这个表需要增加字段 增加完以后你就发现 他查出来的数据是没有新字段的 但是旧字段的数据却确实是最新的 这里就是MyBatis的缓存导致 而关于MyBatisPlus的缓存 二级缓存带来的脏读 我在另一篇文章已经重点讲过 这里把他放出来 不多赘述
这篇文章讲的是在构建映射实体类的时候 需要将类名写成驼峰原则例如:userId(但实际上数据库里面的字段名是user_id)
下发文章说的是他的缓存机制 二级缓存 会把Mapper的映射也给缓存了 简单来说MyBatisPlus把你的所需要查的字段把他缓存起来 当你更新了新的字段的时候 你的缓存映射表当中并没有那个你新增的字段 所以无法识别
想要了解其底层原理可以看看 这是阿里面试的原题
但本篇文献中要说的是上面没有提及的 幻删! 这是个非常神奇的现象 就是使用MyBatis Plus进行删除操作 可能需要复杂的where语句 导致他没有办法找到对应的数据并删除
这是原代码:
Java QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq(“listener_id”, Integer.toString(ListenerId)); queryWrapper.eq(“user_id”, userId); int deletedRows = appointmentMapper.delete(queryWrapper); if (deletedRows > 0) { return Result.ok(“删除成功”); } else { return Result.ok(“删除失败”); }
按照deletedRows 的输出结果 显示已经删除成功 但是!他在数据库中并没有删掉
但是使用下面这个来删除却没有问题
Java int deletedRows = appointmentMapper.deleteById(appointment.getId()); if (deletedRows > 0) { return Result.ok(“删除成功”); } else { return Result.ok(“删除失败”); }
后面我仔细研究了幻删的代码 发现还有可能还是变量名的问题
在我构建条件的语句当中的变量名并没有使用上方说的驼峰原则
我给出的总结就是 删除尽量使用对应的id来删除