当我从数据库中批量进行删除的时候发现,如果通过集合或者数组作为sql删除的参数传入的时候,如果数组或者集合为空的时候,sql语法就会报错。
比如
#delete from user id in(数组/集合的值)
delete from user id in ();
这个时候拼接的sql语句就是错误的。
如何解决呢?思路是进行判断,当数组或者集合不为空并且长度不为0的时候,遍历数组或者集合到in()中,当数组或者集合的长度为0或者为空的时候,查询结果为null,而不是报错。
难点就是如何在mybatis中进行数组的长度判断。
首先使用命名参数在接口中定义一个参数名
.@Param(参数名)int[] arr
// 实现用户信息批量删除
/**
* 通过id批量删除指定的用户
* @param id 待删除的用户
* @return 受影响的行数
*
*/
int deleteUserMessages(@Param("array")int[] id);
在xml文件中使用choose,when,otherwise进行判断
test里面写的是@Param命名参数定义的参数名,1=2表示恒不成立,当数组或者集合为空的时候,就会进入该判断条件中。,这时候拼接的SQL语句是:sql语法是正确的
delete from user where id in(1=2)
<!-- 批量删除指定的用户 -->
<delete id="deleteUserMessages">
delete from user where id in(
<choose>
<when test="array !=null and array.length>0">
<foreach collection="array" item="id" separator="," index="index">
#{id}
</foreach>
</when>
<otherwise>
1=2
</otherwise>
</choose>
)
</delete>