今天写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=”)“ 不给显示  所以我就改成带括号的。

mybatis的foreach标签的更多相关文章

  1. mybatis中<foreach>标签的使用

    标签太多,记一下不是特别常用的标签~留着脑袋瓜不机灵的时候看! <foreach>标签  该标签的作用是遍历集合类型的条件 <select id="countByUserL ...

  2. MyBatis的foreach标签与SUM函数同时使用

    最近在项目中遇到一个,需要根据传入的存有id的list,计算值,再起别名 <if test="channelList != null and channelList.size()> ...

  3. 【Mybatis】<foreach>标签在mybatis中的使用

    mapper.xml如下: <select id="selectCkspcb" parameterType="java.util.Map" resultT ...

  4. Mybatis foreach标签含义

    背景 考虑以下场景: InfoTable(信息表): Name Gender Age Score 张三 男 21 90 李四 女 20 87 王五 男 22 92 赵六 女 19 94 孙七 女 23 ...

  5. MyBatis的Mapper文件的foreach标签详解

    MyBatis的Mapper文件的foreach标签用来迭代用户传递过来的Lise或者Array,让后根据迭代来拼凑或者批量处理数据.如:使用foreach来拼接in子语句. 在学习MyBatis M ...

  6. MyBatis foreach标签遍历数组

    有时候开发中需要根据多个ID去查询,可以将ID封装为List或者数组然后使用MyBatis中的foreach标签构建in条件. 这里我将ID封装为String[]作为参数. <select id ...

  7. mybatis foreach标签

    一.批量插入数据 示例:添加订单商品表 1.模型层的相应代码 /** * 添加订单商品表 * @param ordergoods * @return */ public boolean addOrde ...

  8. Mybatis批量insert 返回主键值和foreach标签详解

    Mybatis批量insert 返回主键 Mybatis从3.3.1版本开始,支持批量插入后返回主键ID.首先对于支持自增主键的数据库使用useGenerateKeys和keyProperty,对于不 ...

  9. mybatis <where>、<set>、<trim>、<sql>、<foreach>标签的使用

    转:http://www.cnblogs.com/lixiujie/p/5766669.html <resultMap>标签的使用:这个类似于hibernte用于映射我们创建的vo对象与数 ...

随机推荐

  1. DSAPI 添加删除程序到Windows启动

    使用DSAPI.dll中文件类里现成的功能,将使你可以快速高效地实现将程序加入Windows启动项或从启动项中删除. 简单也是非常地简单,但由于是比较独立的功能,所以单独发表为整个篇幅.  DSAPI ...

  2. 经典JS的HTML转义与反转义字符

    //HTML转义 function HTMLEncode(html) { var temp = document.createElement ("div"); (temp.text ...

  3. 从零开始学安全(三十六)●利用python 爆破form表单

    import sys import requests from requests.auth import HTTPBasicAuth def Brute_Force_Web(postData): re ...

  4. C# 操作Word书签(二)——插入图片、表格到书签;读取、替换书签

    概要 书签的设置可以帮助我们快速的定位某段文字,使用起来很方便,也很节省时间.在前一篇文章“C# 如何添加/删除Word书签”中介绍了插入.删除书签的方法,本篇文章将对C# 操作Word书签的功能做进 ...

  5. Hdu 3001 Travelling 状态DP

    题目大意 一次旅游,经过所有城市至少一次,并且任何一座城市访问的次数不能超过两次,求最小费用 每个城市最多访问两次,用状态0,1,2标识访问次数 把城市1~N的状态按照次序连接在一起,就组成了一个三进 ...

  6. GC垃圾回收

    我们在开发需求的时候,可能很少关注到垃圾回收,因为我们绝大多数的时候都是使用的托管资源,托管资源的内存回收.net已经帮我们做了,但是.net的内存回收不是实时的,所以我们还是要关注下.net的垃圾回 ...

  7. mysql过程函数的建立与使用

    记一次数据库函数的学习:工作中接口出现问题,导致页面数据显示错误,跟踪代码查看,最后找到sql语句中,但是sql比较复杂,同时调用了大量的函数,以此记录mysql函数的学习. 首先创建一个函数 选择参 ...

  8. asp.net/wingtip/UI和导航

    ASP.NET Web窗体可以让web应用创建动态内容.静态网页的知识和HTML.CSS一模一样,区别在于ASP.NET网页包括了ASP.NET可以识别并处理的服务器端的内容.对于静态页面(.html ...

  9. TomCat的安装及测试

    1.每个版本的安装都是一样,解压之后是一个文件夹 2.配置环境变量,右击我的电脑,属性--高级属性设置--环境变量--新建--配path即可(path后加;%CATALINA_HOME%\bin;) ...

  10. (转载)最完整的自动化测试流程:Python编写执行测试用例及定时自动发送最新测试报告邮件

    今天笔者就要归纳总结下一整套测试流程,从无到有,实现零突破,包括如何编写测试用例,定时执行测试用例,查找最新生成的测试报告文件,自动发送最新测试报告邮件,一整套完整的测试流程.以后各位只要着重如何编写 ...