ibatis批量插入 批量删除 -iterate标签应用

2024-06-08 09:48

本文主要是介绍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, col3 ) values  (?, ?, ?) , (?, ?, ?) , (?, ?, ?) 

 

              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, col3 ) values  (?, ?, ?    ,     ?, ?, ?     ,     ?, ?, ?)

 

         这两种使用方式区别是相当大的. 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语句,这样就能返回影响(插入)的记录数了!

 

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

这篇关于ibatis批量插入 批量删除 -iterate标签应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041838

相关文章

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3

Python实现自动化删除Word文档超链接的实用技巧

《Python实现自动化删除Word文档超链接的实用技巧》在日常工作中,我们经常需要处理各种Word文档,本文将深入探讨如何利用Python,特别是借助一个功能强大的库,高效移除Word文档中的超链接... 目录为什么需要移除Word文档超链接准备工作:环境搭建与库安装核心实现:使用python移除超链接的

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn