今天批量插入看了网上一个这样的讲解,发现插入的时候一直不成功,折腾了很久才明白批量插入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这几个属性需要特别的区分开来.
相关推荐
通过Ibatis3xml文件配置+Mysql实现数据批量插入,原先在网上找很多,都是关于批量更新,批量插入的很少,而且其写法又完全不同,所以自己研究了一下。可供参考。另外插入时如出现内容报错,请参照my.cnf修改书库配置...
通过以上步骤,我们就完成了Ibatis批量插入的DAO实例。在实际项目中,根据业务需求可能需要对SQL语句进行优化,如开启或关闭数据库的自动提交,或者调整批处理的大小以平衡性能和内存消耗。此外,Ibatis还支持使用`...
### iBatis批量处理知识点详解 #### 一、iBatis基本实现 iBatis(现已更名为MyBatis)是一款优秀的持久层框架,它支持定制化SQL、存储过程及高级映射。iBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果...
本文将深入探讨如何利用MyBatis框架结合MySQL数据库实现批量插入功能,包括其原理、配置、代码实现以及优化策略。 ### 一、MyBatis框架简介 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级...
- 批量操作:如何利用iBATIS进行批量插入、更新或删除。 - 动态SQL的最佳实践:分享编写高效动态SQL的技巧和注意事项。 通过深入学习这些文档,开发者可以熟练掌握iBATIS.NET,实现高效、灵活的数据访问,同时...
Ibatis提供了两种执行器:SimpleExecutor和BatchExecutor,分别对应单条SQL执行和批量SQL执行。 5. ParameterMap和ParameterHandler:它们负责参数的设置和处理,ParameterMap代表了SQL参数的映射关系,而...
iBatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在XML配置文件中,方便数据库操作。 在小组后台管理中,存在以下几个与iBatis相关的问题: 1. **小组分类管理** - **问题1**: 在删除二级分类时,未...
1. **批处理**:通过设置 SqlSession 的 flushCache 和 autoCommit 属性,可以实现批量插入、更新等操作,提高性能。 2. **合理使用缓存**:根据业务需求调整缓存策略,避免不必要的数据库访问。 **七、与其他技术...
5. **Executor**: 执行器,是Ibatis内部处理SQL的组件,有简单执行器、缓存执行器和批量执行器等类型。 6. **Statement**: 表示一个SQL语句,可以是PreparedStatement或SimpleStatement,Ibatis根据配置自动处理...
### iBatis批量操作 #### 一、简介 在企业级应用开发中,数据库操作是不可或缺的一部分。为了提高效率和减少资源消耗,批量处理成为了一种常用的技术手段。本文将介绍如何利用iBatis框架进行批量添加、修改、删除...
1. **配置文件**: iBatis的配置文件定义了数据库连接信息、SqlMap的位置等,是系统运行的基础。 2. **SqlMap**: SqlMap是iBatis的核心,它包含了SQL语句和结果映射。每个SqlMap元素代表一个数据库表,而SqlMap中的...
此外,文档还特别强调了如何通过iBATIS来调用存储过程,这是数据库操作中的一个重要特性,尤其是在处理复杂逻辑或批量操作时。 **iBATIS-SqlMaps-2-Tutorial_cn.pdf** 作为教程,这份文档提供了逐步指导,帮助读者...
10. **Batch Operations**: iBATIS 支持批量操作,如插入、更新和删除,可以提高数据处理效率。 从描述 "ibatis-2.3.ibatis-2.3.ibatis-2.3" 看,似乎是在强调这个版本,但并没有提供额外的信息。标签 "ibat" 显然...
在ibatis中,配置文件通常包括`sqlmap`、`datasource`、`settings`等元素,下面详细介绍这些配置项的作用: ##### 1. SQL Map配置 - ****:用于定义和引用属性值,可以在配置文件中使用这些属性值来动态配置参数。 ...
4. 批量操作:BatchExecutor适用于批量插入、更新和删除操作,提高性能。 六、进阶话题 1. 映射器工厂:理解SqlSessionFactoryBuilder、SqlSessionFactory和SqlSession之间的关系,以及如何通过它们创建和管理映射...
在Ibatis中,可以通过设置SqlSession的flushCache和useCache属性,以及使用批处理执行器ExecutorType.BATCH,来实现批量插入、更新或删除。例如,在插入1万条数据时,将这些操作放在同一个SqlSession中,而不是逐一...
例如,了解Executor的实现方式,可以在必要时实现自己的Executor以提高批量插入或更新的效率。 总结,Ibatis源代码的学习不仅有助于理解框架的内部工作机制,还能提升开发者在数据库操作方面的编程能力,使得在实际...