场景:没考虑历史数据:要给负责人发邮件,负责人之前不是必填的,现在是必填的。
现在的查询sql没有考虑到历史数据中负责人字段是null的情况,在查询sql的where条件里加了负责人字段不为null(保证能找到负责人发送邮件), 以为肯定能查出数据, 返回的对象肯定不是null。但是对于历史数据来说,查询返回的对象就是null。并且之后还对查询返回的对象的name属性进行了set,那么就会报空指针的。所以说查询返回的结果是对象,一定要判断对象是否为null, 不为null 了才能进行对象属性的操作。
1、MyBatisPlus的框架:先Goods g = new Goods() ,再调查询sql,g = goodsMapper.getOneGoods(param); 查不到结果,那么对象g 就是 null , 这时g1.setName(“查不到就是null,null还setName就报空指针”); 就会报空指针。所以说查询返回的结果是对象,一定要判断对象是否为null, 不为null 了才能进行对象属性的操作。就算是 先Goods g;再调查询sql,g = goodsMapper.getOneGoods(param); 查不到结果,那么对象g 就是 null。
//g1会在之后被重新赋值,所以new Goods(); 是灰色
Goods g1= new Goods();
//g1被重新赋值,g1查不到结果就是null
g1 = goodsMapper.getOneGoods(param);
g1.getName(); //对象是null, 报空指针
g1.setName("查不到就是null,null还setName就报空指针");
System.out.println(g1); //null
//对象返回的结果是null,可以再new对象
if(ObjectUtils.isEmpty(g1)){
g1 = new Goods();
}
g1.getName(); //不报错
g1.setName("new对象,不报错");//不报错
2、MyBatisPlus的框架:先 List list2 = new ArrayList<>(); 再调查询sql , 查不到结果,那么list2的大小为0,不会是null
就算是先List list2 ;再调查询sql , 查不到结果,那么list2的大小为0,不会是null;
List<Goods> list2 = new ArrayList<>();
param.setName("历史的今天");
list2 = goodsMapper.getGoods(param); // list2().size = 0
System.out.println(list2);