今天写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. 第47章 授权端点(Authorize Endpoint) - Identity Server 4 中文文档(v1.0.0)

    授权端点可用于通过浏览器请求令牌或授权码.此过程通常涉及最终用户的身份验证和可选的同意. 注意 IdentityServer支持OpenID Connect和OAuth 2.0授权请求参数的子集.有关 ...

  2. Captcha服务(后续1)

    既然标题为后续,就要放一下上一篇文章使用.Net Core 2.1开发Captcha图片验证码服务 继续挖坑 时隔7个月再次继续自己在GitHub上挖的坑 https://github.com/Puz ...

  3. FastReport编程方式给Picture控件赋值

    public Image BytesToImage(Byte[] buffer) { var ms = new MemoryStream(buffer, 0, buffer.Length); retu ...

  4. python之编码与解码

    编码 字符串被当作url提交时会被自动进行url编码处理,在python里也有个urllib.urlencode的方法,可以很方便的把字典形式的参数进行url编码.当url地址含有中文或者“/”的时候 ...

  5. [Linux] awk与posix字符集

    awk posix字符集[:alnum:] 文字数字字符[:alpha:] 文字字符[:digit:] 数字字符[:graph:] 非空字符(非空格.控制字符)[:lower:] 小写字符[:cntr ...

  6. springboot、springsecurity、jwt权限验证

    1.背景 基于前后端分离项目的后端模块: 2.相关技术 springboot全家桶 web模块 security模块:用于权限的验证 mongodb 模块:集成mogodb模块 jwt 用于token ...

  7. Sublime 无法安装插件的解决办法

    1,打开命令面板 Ctrl + Shift + P  输入:pi  回车 按回车后,出现异常如下图: 解决办法: 1,点击Preferences----Brows Packages ---会到安装目录 ...

  8. SBC数据格式转换软件

    北京博信施科技有限公司是一家专业从事数据格式转换.数据处理领域研发软件产品和解决方案实施的技术型公司.在当今信息时代,PDF文档格式是在Internet上进行电子文档发行和数字化信息传播的理想文档格式 ...

  9. zabbix3.4 监控mysql 数据库连接数

    zabbix3.4 监控mysql 数据库连接数具体监控配置待定,近期即将发布!

  10. BGP:我们不生产路由,而是路由的搬运工

    1.BGP协议自身不能生产路由,它主要通过配置来将本地路由进行发布或者引入其他路由协议产生的路由. 有两种方法, 方法一.在BGP视图下,通过network命令将本地路由发布到BGP路由表中, 通过本 ...