`
wsjiang
  • 浏览: 394183 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ibatis批量插入-iterate标签应用

阅读更多

      项目开发中在很多地方可能会遇到同时插入多条记录到数据库的业务场景,如果业务级别循环单条插入数据会不断建立连接且有多个事务,这个时候如果业务的事务执行频率相当较高的话(高并发),对数据库的性能影响是比较大的;为了提高效率,批量操作会是不错的选择,一次批量操作只需要建立一次连接且一个事务,能很大程度上提高数据库的效率。

      批量插入操作的sql语句原型如下:

  1. insert  into    
  2.     wsjiang_test(col1, col2, col3)   
  3. values    
  4.     (col1_v, col2_v, col3_v),   
  5.     (col1_v, col2_v, col3_v),  
  6.      ... 

      这里我们以ibatis为例,进行应用说明!

 

     一、 ibatis iterate标签配置说明

  1. < iterate   
  2.     property =""  /*可选,   
  3.         从传入的参数集合中使用属性名去获取值,   
  4.         这个必须是一个List类型,   
  5.         否则会出现OutofRangeException,   
  6.         通常是参数使用java.util.Map时才使用,   
  7.         如果传入的参数本身是一个java.util.List, 不能只用这个属性.  
  8.         不知道为啥官网: http://ibatis.apache.org/docs/dotnet/datamapper/ch03s09.html#id386679  
  9.         说这个属性是必须的, 但是测试的时候是可以不设置这个属性的, 还望那位大虾知道, 讲解一下.  
  10.         */  
  11.     conjunction =""  /*可选,   
  12.         iterate可以看作是一个循环,   
  13.         这个属性指定每一次循环结束后添加的符号,   
  14.          比如使每次循环是OR的, 则设置这个属性为OR*/  
  15.     open =""  /*可选, 循环的开始符号*/  
  16.     close =""  /*可选, 循环的结束符号*/  
  17.     prepend =""  /*可选, 加在open指定的符号之前的符号*/  
  18. > </ iterate >

 

       二、 ibatis iterate标签使用示例

              1、批量查询

  1. < select  id ="iterate_query"  parameterClass ="java.util.List" >   
  2.     <![CDATA[  
  3.         selelct * from wsjiang_test where id=1
  4.     ]]>   
  5.     < iterate  prepend ="prepend"  conjunction ="conn"  open ="open"  colse ="close" >   
  6.         /*使用java.util.List作为参数不能设置property属性*/  
  7.         <![CDATA[  
  8.             #v[]#  
  9.         ]]> /*这里的"[]"是必须的, 要不然ibatis会把v直接解析为一个String*/  
  10.     </ iterate >   
  11. </ select >

             如果传入一个List为[123,234,345], 上面的配置将得到一个sql语句:

                   select * from wsjiang_test where id=1 prepend open 123 conn 234 conn 345 close

 

            2、批量插入

               A、不使用open/close属性

  1. < insert  id =" iterate_insert1 "  parameterClass ="java.util.List" >   
  2.     <![CDATA[  
  3.         insert into wsjinag_test( col1 , col2 , col3 ) values  
  4.     ]]>    
  5.     < iterate  conjunction ="," >   
  6.         <![CDATA[  
  7.             (#test[]. col1 #, # test []. col2 #, # test []. col3 #)  
  8.         ]]>   
  9.     </ iterate >   
  10. </ insert >

              上面的配置将得到一个sql语句:

                   insert  into wsjiang_test( col1, col2, col3values  (?, ?, ?) , (?, ?, ?) , (?, ?, ?) 

 

              B、使用open/close属性

  1. < insert  id ="betchAddNewActiveCode"  parameterClass ="java.util.List" >   
  2.    <![CDATA[  
  3.         insert into wsjinag_test( col1 , col2 , col3 ) values  
  4.     ]]>
  5.     < iterate  conjunction =","  open ="("  close =")" >   
  6.         <![CDATA[  
  7.             /*这里不加"("和")"*/  
  8.             #test[]. col1 #, # test []. col2 #, # test []. col3 #
  9.         ]]>   
  10.     </ iterate >   
  11. </ insert >

             上面的配置将得到一个sql语句:

                  insert  into wsjiang_test( col1, col2, col3values  (?, ?, ?    ,     ?, ?, ?     ,     ?, ?, ?)

 

         这两种使用方式区别是相当大的. conjunction, open 和close这几个属性需小心使用,将其区分开.

 

    三、单条插入返回新增记录主键

          通常情况,ibatis的insert方法需要返回新增记录的主键,但并非任何表的insert操作都会返回主键(这是一个陷阱);要返回这个新增记录的主键,前提是表的主键是自增型的,或者是Sequence的;且必须启用ibatis的selectKey 标签; 否则获取新增记录主键的值为0或者null。

         ibatis的配置:

  1. < insert  id =" iterate_insert1 "  parameterClass ="Object" >   
  2.     <![CDATA[  
  3.         insert into wsjinag_test( col1 , col2 , col3 )
  4.         values   (# col1 #, # col2 #, # col3 #)  
  5.     ]]>    
  6.     < selectKey   keyProperty ="id" resultClass= "Long" >   
  7.         <![CDATA[  
  8.             SELECT LAST_INSERT_ID() AS value  
  9.         ]]>   
  10.     </ selectKey >   
  11. </ insert >

 

  四、 插入返回 新增记录数

      在第三节中已经讲清楚通过ibatis的insert方法只能得到新增记录的ID; 如果对于无需知道新增记录ID,只需要知道有没有插入成功的业务场景时,特别是对于批量插入,配置的selectKey 可能会有问题时,一次插入多条,拿不到新增的ID,这时我们就只能返回插入成功的记录数来区分是否新增成功!但是insert方法是不会返回记录数;于是我们可以使用ibatis的update方法来调用没有配置 selectKey 标签的insert语句,这样就能返回影响(插入)的记录数了!

 

     某些地方理解不是很深刻,还请不吝赐教!

 

分享到:
评论
6 楼 wsjiang 2014-11-07  
神幻领域.神丿隐 写道
原来是这样啊.

是的,你可以测试下!
5 楼 神幻领域.神丿隐 2014-10-31  
wsjiang 写道
神幻领域.神丿隐 写道
< insert  id ="betchAddNewActiveCode"  parameterClass ="java.util.List" >   
   <![CDATA[ 
        insert into wsjinag_test( col1 , col2 , col3 ) values 
    ]]>
    < iterate  conjunction =","  open ="("  close =")" >  
        <![CDATA[ 
            /*这里不加"("和")"*/ 
            #test[]. col1 #, # test []. col2 #, # test []. col3 #
        ]]>  
    </ iterate >  
</ insert >


这里面的 #test[]   是那来的??? 不懂啊。。。


这里的test[]就是在dao层调用SqlMapClient时传入的需要插入数据库的对象数组

原来是这样啊
4 楼 神幻领域.神丿隐 2014-10-31  
原来是这样啊.
3 楼 wsjiang 2014-10-23  
神幻领域.神丿隐 写道
< insert  id ="betchAddNewActiveCode"  parameterClass ="java.util.List" >   
   <![CDATA[ 
        insert into wsjinag_test( col1 , col2 , col3 ) values 
    ]]>
    < iterate  conjunction =","  open ="("  close =")" >  
        <![CDATA[ 
            /*这里不加"("和")"*/ 
            #test[]. col1 #, # test []. col2 #, # test []. col3 #
        ]]>  
    </ iterate >  
</ insert >


这里面的 #test[]   是那来的??? 不懂啊。。。


这里的test[]就是在dao层调用SqlMapClient时传入的需要插入数据库的对象数组
2 楼 神幻领域.神丿隐 2014-10-08  
< insert  id ="betchAddNewActiveCode"  parameterClass ="java.util.List" >   
   <![CDATA[ 
        insert into wsjinag_test( col1 , col2 , col3 ) values 
    ]]>
    < iterate  conjunction =","  open ="("  close =")" >  
        <![CDATA[ 
            /*这里不加"("和")"*/ 
            #test[]. col1 #, # test []. col2 #, # test []. col3 #
        ]]>  
    </ iterate >  
</ insert >


这里面的 #test[]   是那来的??? 不懂啊。。。
1 楼 hechiheng 2013-04-25  
insert  into   
    wsjiang_test(col1, col2, col3)  
values   
    (col1_v, col2_v, col3_v),  
    (col1_v, col2_v, col3_v), 
     ...

sql的这种写法,在oracle中不支持吧?

相关推荐

    ibatis-3-core-3.0.0.242.jar.zip

    ibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zipibatis-3-core-3.0.0.242.jar.zip

    apache开源项目源码ibatis-3-core-src-3.0.0.227(ibatis框架java源程序)

    apache开源项目源码ibatis-3-core-src-3.0.0.227 ibatis框架java源程序 spring,struts,hibernate,ibatis,框架源码 各种ibatis框架应用源码,你会从中得到意想不到的效果! apache开源组织开发的开源项目源码,其...

    ibatis-3-core-3.0.0.200

    ibatis-3-core-3.0.0.200

    ibatis-3-core-3.0.0.242.zip

    ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip ibatis-3-core-3.0.0.242.zip

    ibatis-core-3.0.jar.zip

    《深入解析iBatis核心库:ibatis-core-3.0.jar》 iBatis,一个优秀的持久层框架,以其轻量级、易用性、灵活性等特性深受开发者喜爱。在Java开发领域,iBatis作为数据访问层的解决方案,为数据库操作提供了强大的...

    ibatis-common-2.jar

    ibatis-common-2.jar...........

    ibatis3批量插入

    通过Ibatis3xml文件配置+Mysql实现数据批量插入,原先在网上找很多,都是关于批量更新,批量插入的很少,而且其写法又完全不同,所以自己研究了一下。可供参考。另外插入时如出现内容报错,请参照my.cnf修改书库配置...

    ibatis-dao-2.jar

    ibatis-dao-2.jar gggggggggggg

    ibatis-sqlmap-2.jar

    ibatis-sqlmap-2.jar 对数据库进行操作的jar包 很方便使用

    ibatis标签

    至于压缩包中的DE_iBATIS-SqlMaps-2_cn.pdf文件,这可能是一份关于iBATIS SqlMaps的中文文档,可能包含了对`&lt;iterate&gt;`标签的详细解释,包括其语法、使用场景、示例以及注意事项等内容。这份文档对于学习和理解...

    ibatis-3-core-3.0.0.204

    ibatis-3-core-3.0.0.204 最新官方下载版

    ibatis-sqlmap-2.jar.zip

    在`ibatis-sqlmap-2.jar.zip`中,虽然未直接提供具体的SQL映射文件,但在实际应用中,开发者会根据需求创建这些XML文件,定义SQL语句和结果映射。 2. SQL执行:在iBatis中,通过`SqlSession`接口来执行SQL。例如,`...

    IBatis-SQL-MAPs 开发指南

    IBatis-SQL-MAPs 开发指南IBatis-SQL-MAPs 开发指南IBatis-SQL-MAPs 开发指南IBatis-SQL-MAPs 开发指南IBatis-SQL-MAPs 开发指南

    Ibatis基本配置---[环境搭建

    Ibatis基本配置---[环境搭建

    ibatis-3-core-3.0.0.227.z

    本文将围绕"ibatis-3-core-3.0.0.227.z"这个压缩包,详细介绍其包含的元素以及相关的知识要点。 首先,"ibatis-3-core-3.0.0.227.jar"是iBatis的核心库文件,包含了iBatis框架的主要功能。这个JAR文件包含了所有...

    ibatis缓存介绍 - 勇泽 - 博客园.mht

    ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园ibatis缓存介绍 - 勇泽 - 博客园

    ibatis-core-3.0.jar org.apache.ibatis.annotations.Param

    `ibatis-core-3.0.jar`是MyBatis的核心库文件,包含了MyBatis框架的主要功能。`org.apache.ibatis.annotations.Param`是MyBatis中的一个重要注解,用于处理方法参数映射。 `@Param`注解主要用于SQL查询中的动态参数...

    ibatis中iterate的例子

    在iBatis中,`&lt;iterate&gt;`标签是一个非常实用的功能,它允许我们处理集合数据,如数组、List或Map等,进行循环遍历并生成动态SQL语句。下面我们将详细探讨`&lt;iterate&gt;`标签的用法及其示例。 `&lt;iterate&gt;`标签的主要...

Global site tag (gtag.js) - Google Analytics