前言
我们在写代码的时候最需要关注的是入参和出参。需要对入参和数据库返回值进行判空校验。
一、入参校验?
入参分为两种:
(1)必传字段:只需要在代码层面做判断,不需要在sql层面做判断
a.单个字段,我们可以在参数的前面加上@NotNull。或者在代码中进行参数为空的校验,返回值一般是跟方法的返回值保持一致,也可以直接抛异常。
b.实体类,我们可以在参数前面加上@NotNull,表示这个前端传的实体类不为空。这时候我们可以在自定义的实体类中加上@NotNull(message=" ")注解,或者在代码中对这个实体类的某些字段进行判空校验。
(2)非必传字段:在代码层面不需要做判空校验,只需要在sql层面做判断
以下sql中:activityId是必传字段,periodStage是非必传字段
select
coupon_id
from eiop_act_rel_coupon
where del_flag=0
and activity_id=#{activityId}
and Remark6=#{periodStage}
order by activity_coupon_id
二、数据库返回值的校验
对数据库返回值进行处理时要小心,不同的返回值类型将导致不同的空值校验逻辑
查询结果分为两种:集合(List和Set)和其他的对象类型
对List,Set集合要进行(值.size)的校验。
对Map与普通对象类型,返回值先进行isNull校验,再进行(值.size)的校验(因为即使Map等类型不为null也很可能为:“空集合”),并且Map等类型不能直接进行(值.size)校验,因此才能保证此处校验不至于出现空指针异常bug.
1.返回值结果为List<泛型类型无所谓>,set<泛型类型无所谓>时
此时的sql语句无结果时的返回值将是一个空集合,类似:[ ]这种类型。此时无需对返回结果进行任何校验,因为返回值是一个空集合,遍历空集合时,遍历内逻辑将不会执行。同时不会出现空指针异常bug。
并且对设定为List与Set类型的返回值进行空指针校验是无意义的。
也就是说:
List test=iMapper.getTestDemo(param);
if(test==null){//逻辑代码}
这种校验没有意义,test值永远不为null,逻辑代码永远不会被执行;要对List,Set类型返回结果进行是否为空值校验,必须校验他们的size大小,当size=0时,查询结果为空。
list集合要进行判断:
if(!CollectionUtils.isEmpty())
这样的话如果条件不成立,字段为null
前端判断这个字段没有值,就不用get这个字段了,减少了前端的工作量。
2.当返回值为Map,对象类型,String类型时
此时sql语句查询无结果时将返回null值,此时若直接对Map进行遍历操作便会出现空指针异常bug,因此必须对该返回结果进行是null的校验。
Map<String,String> test=iMapper.getTestDemo(id);
if(test==null)
return ;
//此时内逻辑将可能执行
总结
判空:—最好使用对应的工具类进行判空操作
(1)空字符串
str !=null && str !=" "
StringUtils.isNotBlank(str)
(2)对象
actInfo !=null
ObjectUtils.isNotEmpty()
!ObjectUtils.isEmpty();
(3)集合
actInfoList !=null && actInfoList.size()>0
CollectionUtils.isNotEmpty()
!CollectionUtils.isEmpty()
非空校验
返回格式:按方法的返回值格式
如果方法没有返回值(void)
throw new RuntimeException(“activityId can not be empty!”)