在使用MyBatis中使用where in (xx...)
时,需要用foreach拼接括号内容,可是当传进来的数组为空时,sql就会变成where in ()
导致报错,这时应该这样解决:
<select>
select xxx... from xxx
<where>
...
<if test="queryParam1 != null">
and column1 in
(-1
<foreach collection="queryParam1" open="," separator="," item="item" index="index">
#{item}
</foreach>
)
</if>
</where>
</select>
为什么要像上面那样的复杂写法来解决报错问题?其实下面这种方法也能避免报错问题,但是禁止使用下面这种方法:
<if test="queryParam1! = null and queryParam1.length > 0">
...
</if>
或
<if test="queryParam1! = null and queryParam1.size() > 0">
...
</if>
因为实际项目中如果传了空数组进来代表没有数据,如果没有拼接上where in条件的话相当于直接忽略了where条件,造成事故。
例如:
- 在删除数据的时候,如果忽略了where条件就会误删数据。
- 在查询数据的时候,如果忽略了where条件就会造成查询数据结果错误。