ibatis批量插入数据-iterate标签详解及应用
2012-02-15 09:40
281 查看
我们都知道mysql支持:
Sql代码
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代码
<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>
我们设置来做个实验:
Xml代码
<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代码
select * from tb_name where id=123 prepend open 1111 conn 2222 conn 3333 close
对于上面的应用场景, 我们可以:
Xml代码
<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代码
insert into tb_active_code(code, create_uin, create_time) values (?, ?, ?) , (?, ?, ?) , (?, ?, ?)
但是如果:
Xml代码
<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代码
insert into tb_active_code(code, create_uin, create_time) values ( ?, ?, ? , ?, ?, ? , ?, ?, ?)
可以看到区别还是很大的.所以conjunction, open 和close这几个属性需要特别的区分开来.
可能有些地方理解的不是很好, 如果有错误, 还请不吝赐教.
参考连接: http://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html#id386679
Sql代码
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代码
<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>
我们设置来做个实验:
Xml代码
<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代码
select * from tb_name where id=123 prepend open 1111 conn 2222 conn 3333 close
对于上面的应用场景, 我们可以:
Xml代码
<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代码
insert into tb_active_code(code, create_uin, create_time) values (?, ?, ?) , (?, ?, ?) , (?, ?, ?)
但是如果:
Xml代码
<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代码
insert into tb_active_code(code, create_uin, create_time) values ( ?, ?, ? , ?, ?, ? , ?, ?, ?)
可以看到区别还是很大的.所以conjunction, open 和close这几个属性需要特别的区分开来.
可能有些地方理解的不是很好, 如果有错误, 还请不吝赐教.
参考连接: http://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html#id386679
相关文章推荐
- ibatis批量插入数据-iterate标签详解及应用
- ibatis批量插入数据-iterate标签详解及应用
- ibatis批量插入 批量删除 -iterate标签应用
- ibatis批量插入-iterate标签应用
- IBatis批量插入数据
- 无废话Android之listview入门,自定义的数据适配器、采用layoutInflater打气筒创建一个view对象、常用数据适配器ArrayAdapter、SimpleAdapter、使用ContentProvider(内容提供者)共享数据、短信的备份、插入一条记录到系统短信应用(3)
- 向数据库中插入数据并返回当前插入的行数及全局变量@@IDENTITY应用
- logic:iterate 标签换行 打印数据
- Excel VBA高效办公应用-第五章-销售数据的处理与分析-Part1(自动插入多张图表)
- 详解Android系统中跨应用数据分享功能的实现
- 大数据应用之HBase数据插入性能优化之多线程并行插入测试案例
- VC中ODBC数据库技术应用源程序详解之一(串口数据保存相关)
- 【Android 应用开发】Android 数据存储 之 SQLite数据库详解
- struts2标签库----数据标签详解
- 详解MyBatis动态生成表插入数据
- VC中ODBC数据库技术应用源程序详解之一(串口数据保存相关)
- jstl中的fmt标签的应用,日期数据的转换
- JS函数动作分层结构详解及Document.getElementById 释义 js及cs数据类型区别 事件 函数 变量 script标签 var function
- 【Android 应用开发】Android 数据存储 之 SQLite数据库详解
- 应用VS2005 SQL事务和批量插入数据