`
patternhe
  • 浏览: 42763 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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

阅读更多

我们都知道mysql支持:

 

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>

 我们设置来做个实验:

 

<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

 对于上面的应用场景, 我们可以:

 

<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 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 ( ?, ?, ?   ,   ?, ?, ?   ,   ?, ?, ?)

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

 

 

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

 

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

4
9
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics