踩坑: 通用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);
}
分类:
开发问题记录
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器