tkmybatis逻辑删除踩坑原理详解
逻辑删除示例(前景提要)
在实体类中加入@LogicDelete字段,表示在数据库中对这张对应的表进行逻辑删除。
Question
在引入 tkmybatis逻辑删除后,日常使用如下方法
public int delete(T t);
public int deleteByExample(Example example);
public int deleteByCondition(Object condition);
public int deleteByPrimaryKey(Object key);
会对该表中的数据进行逻辑删除,此时逻辑删除是生效的。但是今天当使用了这个方法:
public int deleteByIds(String ids);
发现逻辑删除失效了,导致我以为@LogicDelete这块出问题了,后来先试了试别的删除方法发现逻辑删除是正常的。估计是deleteByIds方法本身的实现出了问题。怎么办呢?那只能去源码里面一探究竟了。
Solution
跳入方法只有一个接口,方法上面的注解标注了provider类,跳入一探究竟。
可以看出来,这个方法实现体根本就没有判断实体类是不是含有@LogicDelete注解,直接在拼SQL时,拼入Delete 关键字,这要能逻辑删除就见鬼了。
接下来上一下实现了逻辑删除的代码片
解决方法
1.用deleteByExample\deleteByCondition代替deleteByIds方法
2.或者自己写一段代码,来覆盖掉这个接口。
总结
嗯,有一些不太理解为什么要这么做,既然做了逻辑删除应该所有的删除方法都应该实现,结果这个却漏了,不知道是开发人员漏了还是故意的。希望以后的开发中不会像这样,给别人挖坑。