ibatis批量插入数据-iterate标签详解及应用
- insert into
- tb_name(col1, col2, col3)
- values
- (col1_v, col2_v, col3_v),
- (col1_v, col2_v, col3_v),
- ...
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标签有几个属性:
- <iterate
- property="" /*可选,
- 从传入的参数集合中使用属性名去获取值,
- 这个必须是一个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>
<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>
我们设置来做个实验:
- <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>
<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语句:
- 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
对于上面的应用场景, 我们可以:
- <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>
<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语句:
- insert into tb_active_code(code, create_uin, create_time) values (?, ?, ?) , (?, ?, ?) , (?, ?, ?)
insert into tb_active_code(code, create_uin, create_time) values (?, ?, ?) , (?, ?, ?) , (?, ?, ?)
但是如果:
- <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>
<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语句为:
- 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标签详解及应用相关推荐
- mysql批量删除数据sql语句_mysql批量删除数据sql语句详解
1.like与 in批量删除指定记录 like语法 like主要是用来模糊查询了 sql = "delete from A where field like '%ABC%'" 这个 ...
- java批量执行查询sql语句_详解MyBatis直接执行SQL查询及数据批量插入
一.直接执行SQL查询: 1.mappers文件节选 ${paramSQL} 2.DAO类节选 public interface SomeDAO{ List getInstanceModel(@Par ...
- ibatis 批量插入
ibatis 批量插入 CreationTime--2018年7月2日10点21分 Author:Marydon 1.说明 基于oracle的sql语句 2.主键id有默认值,比如:sys_guid( ...
- 前端基础-HTML的的标签详解
阅读目录 一.head内常用标签 二. HTML语义化 三. 字符实体 四. h系列标签 五. p标签 六. img标签 七. a标签 八. 列表标签 九. table标签 十. form标签 一. ...
- Discuz3.数据库数据表字典详解(完整版)
Discuz3.数据库数据表字典详解(完整版) 转自:https://discuzt.cr180.com/discuzcode-db.html pre_common_admincp_cmenu后台菜单 ...
- web前端 --- HTML标签详解
HTML标签详解 head头标签: meta标签.title标签.link标签.style标签.script标签 body标签: 字体标签: h1~h6标签.font标签.u标签.b标签.strong ...
- php addall,ThinkPHP3.2框架使用addAll()批量插入数据的方法
这篇文章主要介绍了ThinkPHP3.2框架使用addAll()批量插入数据的方法,结合实例形式分析了thinkPHP针对单条数据插入及批量数据插入操作的相关实现技巧,需要的朋友可以参考下 本文实例讲 ...
- thinkphp mysql批量入库_ThinkPHP3.2框架使用addAll()批量插入数据的方法
本文实例讲述了ThinkPHP3.2框架使用addAll()批量插入数据的方法.分享给大家供大家参考,具体如下: thinkphp中model类的addAll()方法可以将数据同时添加到数据库中. / ...
- django11:自动序列化/批量插入数据/分页器
自动序列化 借助serializers帮你自动完成序列化 from app01 import models from django.core import serializers def ab_se( ...
最新文章
- Android 笔记:BroadcastReceiver
- 情人节,你刚表白,而我已经开始选哪里拍婚纱照了~
- 数组去重--这几种方法够不?
- 从String中移除空白字符的多种方式!?差别竟然这么大!
- JZOJ 5404. 【NOIP2017提高A组模拟10.10】Graph
- 【excel】日期函数DateDif
- GitLab CI/CD 因git凭据踩坑
- 浮点运算和代码优化, 音频常识, 并行计算
- Python数据清洗 - 洗什么?怎么洗?看完就明白了
- 【原】无脑操作:ElasticSearch学习笔记(01)
- 【例9.7】友好城市
- Nginx(代理)+Tomcat(Java)+Apache(PHP)共用80端口
- 第4次作业类测试代码 021
- 位运算判断两个数是否异号
- Ant Design Vue 表格行内编辑!!!
- CNTV视频回看下载地址
- win10 桌面右键菜单内容修改
- 普通学历,大一大二要不要打ACM?
- 有一种焦虑叫三十不立
- 公云等相关应用怎样用