Bug记录 -- 前端传值 null

本文最后更新于:4 个月前

在后台开发经常会遇到的一个需求:

用户输入id,我们就根据这个id去数据库里面找相应的数据。

但是,用户还可以选择在id的同时传入一段时间,(start和end)在这段时间内查找数据。

甚至,用户还可以选择第三个条件上传者uploader,需要我们同时根据id,时间,和上传者三个条件同时查找数据。

不过解决方法其实很简单,我们不需要在java程序里进行复杂的条件判断到底哪几个条件为空,在每个条件下单独写sql语句。

我们只需要在mybatis的mapper.xml里,进行if判断即可。

select *
from tableName
where id = #{id,jdbcType = INTEGER}
<if test = "start!=null and start !='' and end !=null and end != ''">
	and date between #{start,jdbcType=TIMESTAMP} and #{end,jdbcType=TIMESTAMP}
</if>
<if test = uploader!=null and uploader!='' ">
	and uploader = #{uploader,jdbcType=VARCHAR}
</if>

这样,如果用户输入的某一个条件为空,那么就不会用于sql的条件判断里。

经过测试事实也的确是这样

当前端传了uploader=,后面没有值的时候,没有问题

{
    id: 1
    uploader:
}

当前端不传uploader,也没有问题

{
    id:1
}

但是!!!!

当前端传的是

{
    id:1
    uploader:null
}

这时传入的就是null这个字符串!!!

虽然前端返回的的的确确返回的就是null(空),但是后台在接收的时候就变成了**null(字符串)**

由此,我们可以大胆的把if判断改成如下格式

<if test = 'uploader != "null" and uploader!=null and uploader!="" '>
	and uploader = #{uploader,jdbcType=VARCHAR}
</if>

注意单双引号有所改变


还有一个很坑的点,后台时间参数是Date类型时,传入的必须是2019/08/27 23:26:41这样的时间格式

而传入参数为2019-08-27 23:26:41时,后台就必须为String类型的,否则会出现参数不匹配的错误(MisMatch)

而且,当参数是String时,无需担心和Date类型不匹配,直接传入String到mapper.xml里,不过记得jdbcType还是写TIMESTAM即可。可能mybatis框架会有优化吧。