今天写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. 解决IIS无法启动w3svc

    1>:首先在CMD命令行中输入:fsutil resource setautoreset true c:\ 2>:然后在运行services.msc 3>:找到Windows Pro ...

  2. IOS自带输入法中文不触发KEYUP事件导致vue双向绑定错误问题

    先上图: 可以看到输入框中的内容和弹出框的内容不一致, <input class="am-fr labRight" id="txcode" type=&q ...

  3. Linux下Redis服务器搭建

    系统环境 操作系统:CentOS 6.9 redis版本:redis-4.0.2 安装步骤 1,安装预环境 运行以下命令安装预环境. [root@redis02 redis-4.0.2]# yum - ...

  4. 纯CSS修改checkbox复选框样式-02

    我有用过这个纯修改input属性的 本人修改后的代码和效果图(修的不好), 这个是改动最简单的: css代码 input[type=checkbox]{ visibility: hidden; } i ...

  5. 在java中写出完美的单例模式

    1. 前言 单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现的——基本上每个开发者都能够随手写出——但是,真的是这样吗? 作为一个Java开发者,也许你觉得自己对单例 ...

  6. asyncio异步IO--同步原语

    asyncio同步原语与线程(threading)模块同步原语基本类似,但有两点重要区别: asyncio同步原语非线程安全,因此不应被用作系统线程同步(可以使用threading代替): async ...

  7. Vue一个案例引发「内容分发slot」的最全总结

    今天我们继续来说说 Vue,目前一直在自学 Vue 然后也开始做一个项目实战,我一直认为在实战中去发现问题然后解决问题的学习方式是最好的,所以我在学习一些 Vue 的理论之后,就开始自己利用业余时间做 ...

  8. Linux & Windows 环境下 Redis 安装与基本配置

    索引: 目录索引 参看代码 GitHub: redis.txt 一.Linux (DeepinOS) 环境 .安装Redis服务 sudo apt-get install redis-server . ...

  9. SQL根据细粒度为天的查询

    当我们集成了一些前端框架,在某些展示页面上往往具有某些查询条件.而这其中日期查询的处理又较为麻烦,此处,我罗列了一种当前台上传了一种默认的date格式的日期查询数据至后台未经Controller或Se ...

  10. UPUPW配置

    UPUPW下载地址 https://sourceforge.net/projects/upupw/files/ANK/?tdsourcetag=s_pctim_aiomsg 配置 在这里插入图片描述