Sql代码  
  1. insert into
  2. tb_name(col1, col2, col3)
  3. values
  4. (col1_v, col2_v, col3_v),
  5. (col1_v, col2_v, col3_v),
  6. ...
insert into tb_name(col1, col2, col3) values (col1_v, col2_v, col3_v), (col1_v, col2_v, col3_v),...

这样批量插入多条数据, 使用场景是, 当初始化某用户的数据库信息时.

比如现在, 我们有一个产品激活才能使用,并且激活才能使用的需求, 同时

当一个用户激活自己的帐户的同时(或者一段时间之后), 可以获得若干个激活码

提供给自己的其他朋友激活. 我们把激活看做一个实体, 使用一张单独的表结构存储.

现在如果我们想使用ibatis来实现这个需求怎么办呢?

使用过ibatis 的人都会想到iterate. 没错我们现在就是要用ibatis的iterate来实现.

iterate标签有几个属性:

Xml代码  
  1. <iterate
  2. property="" /*可选,
  3. 从传入的参数集合中使用属性名去获取值,
  4. 这个必须是一个List类型,
  5. 否则会出现OutofRangeException,
  6. 通常是参数使用java.util.Map时才使用,
  7. 如果传入的参数本身是一个java.util.List, 不能只用这个属性.
  8. 不知道为啥官网: http://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html#id386679
  9. 说这个属性是必须的, 但是测试的时候是可以不设置这个属性的, 还望那位大虾知道, 讲解一下.
  10. */
  11. conjunction="" /*可选,
  12. iterate可以看作是一个循环,
  13. 这个属性指定每一次循环结束后添加的符号,
  14. 比如使每次循环是OR的, 则设置这个属性为OR*/
  15. open="" /*可选, 循环的开始符号*/
  16. close="" /*可选, 循环的结束符号*/
  17. prepend="" /*可选, 加在open指定的符号之前的符号*/
  18. ></iterate>
<iterateproperty="" /*可选, 从传入的参数集合中使用属性名去获取值, 这个必须是一个List类型, 否则会出现OutofRangeException, 通常是参数使用java.util.Map时才使用, 如果传入的参数本身是一个java.util.List, 不能只用这个属性.不知道为啥官网: http://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html#id386679说这个属性是必须的, 但是测试的时候是可以不设置这个属性的, 还望那位大虾知道, 讲解一下.*/conjunction="" /*可选, iterate可以看作是一个循环, 这个属性指定每一次循环结束后添加的符号, 比如使每次循环是OR的, 则设置这个属性为OR*/open="" /*可选, 循环的开始符号*/close="" /*可选, 循环的结束符号*/prepend="" /*可选, 加在open指定的符号之前的符号*/
></iterate>

我们设置来做个实验:

Xml代码  
  1. <select id="test_iterate" parameterClass="java.util.List">
  2. <![CDATA[
  3. selelct * from tb_name where id=123
  4. ]]>
  5. <iterate prepend="prepend" conjunction="conn" open="open" colse="close">
  6. /*使用java.util.List作为参数不能设置property属性*/
  7. <![CDATA[
  8. #v[]#
  9. ]]>/*这里的"[]"是必须的, 要不然ibatis会把v直接解析为一个String*/
  10. </iterate>
  11. </select>
<select id="test_iterate" parameterClass="java.util.List"><![CDATA[selelct * from tb_name where id=123]]><iterate prepend="prepend" conjunction="conn" open="open" colse="close">/*使用java.util.List作为参数不能设置property属性*/<![CDATA[#v[]#]]>/*这里的"[]"是必须的, 要不然ibatis会把v直接解析为一个String*/</iterate>
</select>

如果传入一个List为[1111,2222,3333], 上面将得到一个sql语句:

Java代码  
  1. select * from tb_name where id=123 prepend open 1111 conn 2222 conn 3333 close
select * from tb_name where id=123 prepend open 1111 conn 2222 conn 3333 close

对于上面的应用场景, 我们可以:

Xml代码  
  1. <insert id="betchAddNewActiveCode" parameterClass="java.util.List">
  2. <![CDATA[
  3. insert into tb_active_code(code, create_user_id, create_time) values
  4. ]]>
  5. <iterate conjunction=",">
  6. <![CDATA[
  7. (#codes[].code#, #codes[].createUserId#, #codes[].createTime#)
  8. ]]>
  9. </iterate>
  10. </insert>
<insert id="betchAddNewActiveCode" parameterClass="java.util.List"><![CDATA[insert into tb_active_code(code, create_user_id, create_time) values]]><iterate conjunction=","><![CDATA[(#codes[].code#, #codes[].createUserId#, #codes[].createTime#)]]></iterate>
</insert>

产生sql语句:

Sql代码  
  1. insert into tb_active_code(code, create_uin, create_time) values (?, ?, ?) , (?, ?, ?) , (?, ?, ?)
insert into tb_active_code(code, create_uin, create_time) values (?, ?, ?) , (?, ?, ?) , (?, ?, ?)

但是如果:

Xml代码  
  1. <insert id="betchAddNewActiveCode" parameterClass="java.util.List">
  2. <![CDATA[
  3. insert into tb_active_code(code, create_user_id, create_time) values
  4. ]]>
  5. <iterate conjunction="," open="(" close=")">
  6. <![CDATA[
  7. /*这里不加"("和")"*/
  8. #codes[].code#, #codes[].createUserId#, #codes[].createTime#
  9. ]]>
  10. </iterate>
  11. </insert>
<insert id="betchAddNewActiveCode" parameterClass="java.util.List"><![CDATA[insert into tb_active_code(code, create_user_id, create_time) values]]><iterate conjunction="," open="(" close=")"><![CDATA[/*这里不加"("和")"*/#codes[].code#, #codes[].createUserId#, #codes[].createTime#]]></iterate>
</insert>

那么产生的sql语句为:

Java代码  
  1. insert into tb_active_code(code, create_uin, create_time) values ( ?, ?, ?   ,   ?, ?, ?   ,   ?, ?, ?)
insert into tb_active_code(code, create_uin, create_time) values ( ?, ?, ?   ,   ?, ?, ?   ,   ?, ?, ?)

可以看到区别还是很大的.所以conjunction, open 和close这几个属性需要特别的区分开来.

可能有些地方理解的不是很好, 如果有错误, 还请不吝赐教.

参考连接: http://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html#id386679

另外可参见以下链接,有比较好的例子:

http://hongzhguan.iteye.com/blog/1222353



ibatis批量插入数据-iterate标签详解及应用相关推荐

  1. mysql批量删除数据sql语句_mysql批量删除数据sql语句详解

    1.like与 in批量删除指定记录 like语法 like主要是用来模糊查询了 sql = "delete from A where field like '%ABC%'" 这个 ...

  2. java批量执行查询sql语句_详解MyBatis直接执行SQL查询及数据批量插入

    一.直接执行SQL查询: 1.mappers文件节选 ${paramSQL} 2.DAO类节选 public interface SomeDAO{ List getInstanceModel(@Par ...

  3. ibatis 批量插入

    ibatis 批量插入 CreationTime--2018年7月2日10点21分 Author:Marydon 1.说明 基于oracle的sql语句 2.主键id有默认值,比如:sys_guid( ...

  4. 前端基础-HTML的的标签详解

    阅读目录 一.head内常用标签 二. HTML语义化 三. 字符实体 四. h系列标签 五. p标签 六. img标签 七. a标签 八. 列表标签 九. table标签 十. form标签 一. ...

  5. Discuz3.数据库数据表字典详解(完整版)

    Discuz3.数据库数据表字典详解(完整版) 转自:https://discuzt.cr180.com/discuzcode-db.html pre_common_admincp_cmenu后台菜单 ...

  6. web前端 --- HTML标签详解

    HTML标签详解 head头标签: meta标签.title标签.link标签.style标签.script标签 body标签: 字体标签: h1~h6标签.font标签.u标签.b标签.strong ...

  7. php addall,ThinkPHP3.2框架使用addAll()批量插入数据的方法

    这篇文章主要介绍了ThinkPHP3.2框架使用addAll()批量插入数据的方法,结合实例形式分析了thinkPHP针对单条数据插入及批量数据插入操作的相关实现技巧,需要的朋友可以参考下 本文实例讲 ...

  8. thinkphp mysql批量入库_ThinkPHP3.2框架使用addAll()批量插入数据的方法

    本文实例讲述了ThinkPHP3.2框架使用addAll()批量插入数据的方法.分享给大家供大家参考,具体如下: thinkphp中model类的addAll()方法可以将数据同时添加到数据库中. / ...

  9. django11:自动序列化/批量插入数据/分页器

    自动序列化 借助serializers帮你自动完成序列化 from app01 import models from django.core import serializers def ab_se( ...

最新文章

  1. Android 笔记:BroadcastReceiver
  2. 情人节,你刚表白,而我已经开始选哪里拍婚纱照了~
  3. 数组去重--这几种方法够不?
  4. 从String中移除空白字符的多种方式!?差别竟然这么大!
  5. JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph
  6. 【excel】日期函数DateDif
  7. GitLab CI/CD 因git凭据踩坑
  8. 浮点运算和代码优化, 音频常识, 并行计算
  9. Python数据清洗 - 洗什么?怎么洗?看完就明白了
  10. 【原】无脑操作:ElasticSearch学习笔记(01)
  11. 【例9.7】友好城市
  12. Nginx(代理)+Tomcat(Java)+Apache(PHP)共用80端口
  13. 第4次作业类测试代码 021
  14. 位运算判断两个数是否异号
  15. Ant Design Vue 表格行内编辑!!!
  16. CNTV视频回看下载地址
  17. win10 桌面右键菜单内容修改
  18. 普通学历,大一大二要不要打ACM?
  19. 有一种焦虑叫三十不立
  20. 公云等相关应用怎样用

热门文章

  1. word中实现文献引用
  2. 验证微软和微软提供给第三方的数字签名
  3. 教你轻松通过微软正版windows验证
  4. oracle触发器 触发事件,Oracle触发器学习记录
  5. 分期付款计算器-Python123编程题库答案-Python从入门到精通挑战台
  6. IOS设置系统代理+APP不走代理绕过方式
  7. Gmsh剖三维网格教程附代码
  8. 游戏服务端之屏蔽字检测
  9. 2012用户体验年会 奇虎360CEO兼首席体验官 周鸿祎主题演讲——简而未减
  10. 容器网络问题排查常用命令