mybatis的foreach标签
今天写sql发现了一点问题,乱弄了好久算是搞定了。关于mybatis的批量插入使用foreach插入形式为:
insert into role_privilege( role_id, privilege_id,last_edit) values ( ?, ?, ? ),( ?, ?, ? ),( ?, ?, ? );
而不不希望是这样的
insert into role_privilege( role_id, privilege_id,last_edit) values ( ?, ?, ? )
insert into role_privilege( role_id, privilege_id,last_edit) values ( ?, ?, ? )
insert into role_privilege( role_id, privilege_id,last_edit) values ( ?, ?, ? )
可以考虑灵活的使用mybatis的foreach标签官方文档是这样子说的
foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。
注意 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象传递给 foreach 作为集合参数。当使用可迭代对象或者数组时,index 是当前迭代的次数,item 的值是本次迭代获取的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
大意就是这样子mybatis帮我们循环一个具有一定长度的数据结构然后遍历其中的数据,用户可以为其中遍历的数据起名并使用 还能设置开始循环时首部元素和尾部元素以及分隔符常用的可以这样试
<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>
然后由于mybatis对数据结构的良好支持,我们可以传给mybatis一些复杂类型的数据结构,如java的Map<String,Object>对象。这里我想说的是map.put("string",String) map.put("String",List)这样式的 可能看这有点迷糊给代码吧:
传给mybatis的参数是这样的
Integer[]privilegeIds
Map<String,Object>map=new HashMap<String,Object>();
map.put("role_id", role_id);
map.put("create_time", new Date());
map.put("privilegeIds", privilegeIds);
其中你期望循环的对象可以是array 可以是 list都ok的我这里是array 但是需要注意的一点是 使用map封装的数据结构和单独传给mybatis有点不同的就是在foreach中collection指定方法不同
如我不想用map封装 只需要传给mybatis一个list 或者array就结束的话应该在foreach中这样写 collection中写的是数据结构名传的参数是list就写list 是数组就array
<foreach collection="list" open="(" close=")" item="privilegeId"
separator="," index="index">
#{privilegeId}
</foreach>
但我这里还需要传两个固定的值 实现就类似于values(1,“a"),(1,"b")这样的其中1是传过来的一个固定的而a和b是遍历的值 那么就可以这样 注意括号
<insert id="addRolePrivilege" parameterType="java.util.Map">
insert ignore into
role_privilege( role_id, privilege_id,last_edit)
values
<foreach collection="privilegeIds" index="index" item="privilege_id" separator=",">
(#{role_id},
#{privilege_id},
#{last_edit})
</foreach>
</insert>
虽然根据常用标准应该写成这样:
<insert id="addRolePrivilege" parameterType="java.util.Map">
insert ignore into
role_privilege( role_id, privilege_id,last_edit)
values
<foreach collection="privilegeIds" index="index" open="(" close=")" item="privilege_id" separator=",">
#{role_id},
#{privilege_id},
#{last_edit}
</foreach>
</insert>
可我代码里写成这样会有问题 就是简单的报错
很明显的错 。。。但我的的确确写了close=”)“ 不给显示 所以我就改成带括号的。