您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐