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