在使用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条件就会造成查询数据结果错误。
