踩坑: 通用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);
    }

 

posted @ 2022-05-10 16:48  loveCrane  阅读(677)  评论(1编辑  收藏  举报