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框架会有优化吧。
本博客所有文章除特别声明外,均采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 。转载请注明出处!