现在的位置: 首页 > 综合 > 正文

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

2013年11月06日 ⁄ 综合 ⁄ 共 2663字 ⁄ 字号 评论关闭

我们都知道mysql支持:

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.      ...  

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

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

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

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

现在如果我们想使用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>  

 我们设置来做个实验:

 

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>  

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

 

Java代码  收藏代码
  1. 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>  

 产生sql语句:

 

Sql代码  收藏代码
  1. 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>  

 那么产生的sql语句为:

 

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

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

 

 

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

 

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

抱歉!评论已关闭.