今天写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. JDK源码分析(四)—— ConcurrentHashMap

    一.概述 ConcurrentHashMap是Java5中新增加的一个线程安全的Map集合,可以用来替代HashTable. 锁分段技术 原理:将数据分成一段一段的存储,然后给每一段数据配一把锁,当一 ...

  2. [前端]AngularJS 簡易物件修改入門

    各位好,今天要來介紹如何簡單的修改網站上AngularJS相關Application的內容 進而做到某些效果.(警告!所有的Web Application都應該在後端加上相關驗證) 透過本篇你可以簡單 ...

  3. Django学习之一:Install Djongo 安装Djongo

    Install Djongo 安装Djongo Djongo是基于python的web框架,自然安装最关心的是python解释器版本了. Prerequisites 安装条件 Python版本与Djo ...

  4. Belgrade Azure 2019-2-11活动感悟

    这是<国外线下技术俱乐部建设>系列文章之一.   活动网址:https://www.meetup.com/Azure-UG-Srbija/events/258673179/ 活动内容:Az ...

  5. Easyui datagrid 扩展单元格textarea editor

    datagrid 扩展单元格textarea editor by:授客 QQ:1033553122 测试环境 jquery-easyui-1.5.3 问题描述 如下,在没有扩展的情况下,初始化如下 手 ...

  6. Maven替换为国内仓库

    <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name&g ...

  7. Left Jion和where区别

    首先,新建两张表A和B,然后插入6条数据到A表,3条数据到B表.语句如下: create table A( ID ,) not null, AName ) null ) create table B( ...

  8. Linux DNS服务配置

    主.从域名服务器配置 一.实验环境 主域名服务器:ns1.topsec.com,192.168.120.119 从域名服务器:ns2.topsec.com,192.168.120.120 二.实验步骤 ...

  9. Scrapy案例01-爬取传智播客主页上的老师信息

    目录 1. 新建scrapy项目 2. 爬虫文件: 2.1. 查看需要爬取内容存在哪里: 2.2. 设置item需要保存的数据变量 2.3. 创建爬虫文件 2.4. 保存数据 2.5. yield的用 ...

  10. 英语口语练习系列-C18-Wildest Dreams

    词汇复习 actor 演员 afternoon 下午 alive 活着的 apple 苹果 adjective 形容词 air 空气 animal 动物 April 四月 adult 成年人 airp ...