在使用MyBatis中使用where in (xx...)时,需要用foreach拼接括号内容,可是当传进来的数组为空时,sql就会变成where in ()导致报错,这时应该这样解决:

    1. <select>
    2. select xxx... from xxx
    3. <where>
    4. ...
    5. <if test="queryParam1 != null">
    6. and column1 in
    7. (-1
    8. <foreach collection="queryParam1" open="," separator="," item="item" index="index">
    9. #{item}
    10. </foreach>
    11. )
    12. </if>
    13. </where>
    14. </select>

    为什么要像上面那样的复杂写法来解决报错问题?其实下面这种方法也能避免报错问题,但是禁止使用下面这种方法:

    1. <if test="queryParam1! = null and queryParam1.length > 0">
    2. ...
    3. </if>
    4. <if test="queryParam1! = null and queryParam1.size() > 0">
    5. ...
    6. </if>

    因为实际项目中如果传了空数组进来代表没有数据,如果没有拼接上where in条件的话相当于直接忽略了where条件,造成事故。
    例如:

    • 在删除数据的时候,如果忽略了where条件就会误删数据。
    • 在查询数据的时候,如果忽略了where条件就会造成查询数据结果错误。