欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-09 19:24:26
...

我们都知道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