今天批量插入看了网上一个这样的讲解,发现插入的时候一直不成功,折腾了很久才明白批量插入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 (),(),()...的格式
参考文献:
2012-02-15 23:53:10--
点击数:
更多
我们都知道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这几个属性需要特别的区分开来.