踩坑: 通用mapper tkmybatis 的delete的坑
今天记录一个使用通用mapper的坑:
在使用 通用mapper delete时 我是这样用的
@Override
public int deleteOldData(String billNo, Set<Integer> refIds) {
Example example = new Example(Tracking.class);
example.createCriteria()
.andEqualTo("id", billNo)
.andNotIn("orderNo", refIds);
return trackingDao.deleteByExample(example);
}
我想删除,id =billNo 同时orderNo不在列表类的数据,正常理解下来 当billNo 为空时:
我预想的语句 delete from table where id =null and orderNo notin ('1','2')
而实际当 billNo == null 时运行的语句为
delete from table where orderNo notin ('1','2');
结果把生产的数据orderNo不在 1,2的数据全删除了 !!!!!!!!!
此次事件造成了生产bug影响的数据,不过还好数据有备份,最后排查出问题后恢复了数据, 真坑 , select语句 为null是 条件还在 delete 时 条件就不在了 谨记
!!
解决方案:
执行删除方法之前,判断参数,如果重要的参数没值就不要进行删除动作了
@Override
public int deleteOldData(String billNo, Set<Integer> refIds) {
if(StringUtils.isEmpty(billNo)){
return 0;
}
Example example = new Example(Tracking.class);
example.createCriteria()
.andEqualTo("id", billNo)
.andNotIn("orderNo", refIds);
return trackingDao.deleteByExample(example);
}