目前项目组持久层用的是 MyBatis 3(v 3.0.4),很多页面涉及到批量删除,查阅了一下myBatis 官方文档,文当中提到需要在MyBatis 的实体配置文件中配置一个元素,<foreach></foreach> 就是该元素。下面给出文档中关于该元素的介绍:
另外一个动态SQL通用的必要操作是迭代一个集合,通常是构建在IN条件中的。比如:
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT * FROM POST P WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。
注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。
以下为是我写的Sql,仅供参考:
<!-- 通过主键集合批量删除记录 -->
<delete id="batchRemoveUserByPks" parameterType="java.util.List">
DELETE FROM LD_USER WHERE ID in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
<delete> 元素的及其属性此处就不罗嗦了。下面说说<foreach>元素,该元素的 item="item" index="index" collection="list" ,上述的这三个属性我都没做任何修改,直接放在此处使用,包括 open="(" 、 separator="," 、 close=")" 这个三个元素也是未做任何修改,需求刚好跟此吻合。每个属性的名字起的非常好,基本上一看就明白什么意思。唯一需要强调的是<foreach>元素中的 #{item},该处应该必须是跟元素中的这个 item="item" 属性一致,这个属性的name 应该是可以自定义的,还没看MyBatis 的源码,此处就不多说了。有兴趣的话可以自己做个Demo 看看。下面的是调用方法的代码片段
List<String> idList = new ArrayList<String>();
idList.add(1);
idList.add(2);
idList.add(3);
userDao.delete("batchRemoveUserByPks",idList);
至此,一个批量删除就搞定了。关于文档中提到的可以直接传过来一个数组,我木有用到过,有兴趣的可以自己些个小Demo 实验一下。虽然第一次用MyBatis,不过感觉用着还是比较舒服的,非常灵活的配置,除了写Sql 麻烦点外(其实完全可以选择用一些工具生成相关SQL文件,当然多多少少还是需要修改的),但这也是MyBatis 的特色,毕竟灵活就意味着自己得更多的手动!