ibatis批量插入 配置

今天批量插入看了网上一个这样的讲解,发现插入的时候一直不成功,折腾了很久才明白批量插入LIST对象的配置应该要改成如下 就成功插入了

<insert id="insertDrillPlanList" parameterClass="java.util.List">
        	INSERT INTO ITMS.DRILL_BRANCH_YEARPLAN( BRANCH_NO, YEAR_NO,
				DRILL_ID, LINE_CODE, LINE_NAME, ITEM_CODE, ITEM_NAME, DRILL_CNT,
				DRILL_DATES, INPUT_USER, INPUT_TIME) VALUES  
		<iterate conjunction="," >            
	            ( #[].branchNo#, #[].year#,
				#[].drillId#, #[].lineCode#, #[].lineName#, #[].itemCode#, #[].itemName#,
				#[].drillCnt#, #[].drillDates#, #[].inputUser#, #[].inputTime# )
		</iterate>
</insert>

 前面用[]来表示当前的对象。<iterate conjunction="," >这里也有一些问题,不能加open(close)这些属性,因为正确的insert table ()values (),(),()...的格式

 

参考文献:

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

 
2012-02-15 23:53:10--点击数:
更多
 
 
<!--本内容来自第七城市www.th7.cn-->

 我们都知道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这几个属性需要特别的区分开来.

 

;