方法一:

<insert id="insertbatch" parameterType="java.util.List">

<selectKey keyProperty="fetchTime" order="BEFORE"

resultType="java.lang.String">

SELECT CURRENT_TIMESTAMP()

</selectKey>

insert into kangaiduoyaodian ( depart1, depart2, product_name,

generic_name, img, product_specification, unit,

approval_certificate, manufacturer, marketPrice, vipPrice,

website, fetch_time, productdesc ) values

<foreach collection="list" item="item" index="index"

separator=",">

( #{item.depart1}, #{item.depart2}, #{item.productName},

#{item.genericName}, #{item.img},

#{item.productSpecification}, #{item.unit},

#{item.approvalCertificate}, #{item.manufacturer},

#{item.marketprice}, #{item.vipprice}, #{item.website},

#{fetchTime}, #{item.productdesc} )

</foreach>

</insert>

方法二:

<insert id="batchInsertB2B" parameterType="ArrayList">
insert into xxxxtable(hkgs,hkgsjsda,office,asdf,ddd,ffff,supfullName,classtype,agent_type,remark)
<foreach collection="list" item="item" index="index" separator="union all">
select #{item.hkgs,jdbcType=VARCHAR},
#{item.hkgsjsda,jdbcType=VARCHAR},
#{item.office,jdbcType=VARCHAR},
#{item.asdf,jdbcType=VARCHAR},
#{item.ddd,jdbcType=VARCHAR},
#{item.ffff,jdbcType=VARCHAR},
#{item.supfullName,jdbcType=VARCHAR},0,0,
#{item.remark,jdbcType=VARCHAR} from dual
</foreach>
</insert>

可以考虑用union all来实现批量插入。
例如:
insert into XX_TABLE(XX,XX,XX)select 'xx','xx','xx' union all select 'xx','xx','xx' union all select 'xx','xx','xx' ...
先拼装好语句再动态传入insert into XX_TABLE(XX,XX,XX)后面部分

MyBatis中批量删除

<!-- 通过主键集合批量删除记录 -->

<delete id="batchRemoveUserByPks" parameterType="java.util.List">

DELETE FROM LD_USER WHERE ID in

<foreach item="item" index="index" collection="list" open="(" separator="," close=")">

#{item}

</foreach>

</delete>

MyBatis中in子句

mybatis in 参数 使用方法

1.只有一个参数

参数的类型要声明为List或Array

Sql配置如下:

<select id="selectProduct" resultMap="Map">

SELECT *

FROM PRODUCT

WHERE PRODUCTNO IN

<foreach item="productNo" index="index" collection="参数的类型List或array">

#{productNo}

</foreach>

</select>

2.多个参数

首先要将多个参数写入同一个map,将map作为一个参数传入mapper

Sql配置如下:

<select id="selectProduct" resultMap="Map">

SELECT *

FROM PRODUCT

WHERE PRODUCTNO IN

<foreach item="productNo" index="index" collection="map中集合参数的名称">

#{productNo}

</foreach>

</select>

MyBatis批量修改

<update id="updateOrders" parameterType="java.util.List">
 update orders set state = '0' where no in
 <foreach collection="list" item="nos" open="(" separator="," close=")">
   #{nos}
 </foreach>
 </update>

MyBatis的关于批量数据操作的体会

  1. MyBatis的前身就是著名的Ibatis,不知何故脱离了Apache改名为MyBatis。
     MyBatis所说是轻量级的ORM框架,在网上看过一个测试报告,感觉相比于Hibernate来说,优势并不明显。

下面说一下比较有趣的现象,根据MyBatis的官方文档,在获得sqlSession时,它有为批量更新而专门准备的:

session = sessionFactory.openSession();//用于普通update
session = sessionFactory.openSession(ExecutorType.BATCH, true);//用于批量update

一般来说,对MYSQL数据库批量操作时速度取决于,是为每一个处理分别建立一个连接,还是为这一批处理一共建立一个连接。按MyBatis的手册说明,选择ExecutorType.BATCH意味着,获得的sqlSession会批量执行所有更新语句。不过我测试了一下,批量插入1000条数据,发觉ExecutorType.BATCH方式的效率居然比普通的方式差很多。我测试用的Mapper中的insert配置如下,再用for循环插入1000条记录:


1 <insert id="insert" parameterType="sdc.mybatis.test.Student">
2 <!-- WARNING - @mbggenerated This element is automatically generated by 
3 MyBatis Generator, do not modify. This element was generated on Mon May 09 
4 11:09:37 CST 2011. -->
5 insert into student (id, name, sex,
6 address, telephone, t_id
7 )
8 values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
9 #{sex,jdbcType=VARCHAR},
10 #{address,jdbcType=VARCHAR}, #{telephone,jdbcType=VARCHAR}, #{tId,jdbcType=INTEGER}
11 )
12 </insert>
    1. 我不清楚原因在哪里, 就配置了MyBatis的log4j,想查看下日志。下载了log4j.jar和commons-logging.jar并配置到项目的类路径,然后在代码路径下新建文件log4j.properties,内容如下:

      
      log4j.rootLogger=DEBUG, stdout
      
      # SqlMap logging configuration...
      log4j.logger.com.ibatis=DEBUG
      log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
      log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=DEBUG
      log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG
      log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG
      log4j.logger.com.ibatis.common.util.StopWatch=DEBUG
      log4j.logger.java.sql.Connection=DEBUG
      log4j.logger.java.sql.Statement=DEBUG
      log4j.logger.java.sql.PreparedStatement=DEBUG
      log4j.logger.java.sql.ResultSet=DEBUG # Console output...
      log4j.appender.stdout=org.apache.log4j.ConsoleAppender
      log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
      log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

      然后再次测试普通的sqlSession,发现日志内容中虽然插入了1000条数据,但只新建了一次连接,最后又关闭了该连接(日志如下)。也就是说MyBatis中的普通sqlSession好像已经对批量插入默认是一次连接中完成,那么还提供ExecutorType.BATCH方式干什么,况且该方式好像效率也不行,或者是我使用ExecutorType.BATCH方式不对??

      
      DEBUG [main] - Created connection 3502256.
      DEBUG [main] - ooo Connection Opened
      DEBUG [main] - ==> Executing: insert into student ( name, sex, address, telephone,t_id ) values ( ?, ?, ?, ?, ? ) 
      DEBUG [main] - ==> Parameters: 新人0(String), male(String), addr0(String),dd(String),3(Integer)
      DEBUG [main] - ==> Executing: insert into student ( name, sex, address, telephone,t_id ) values ( ?, ?, ?, ?, ? ) 
      DEBUG [main] - ==> Parameters: 新人1(String), male(String), 
      ...............
      ...............
      DEBUG [main] - xxx Connection Closed
      DEBUG [main] - Returned connection 3502256 to pool.
    2. 最后一点是关于数据库批量插入时sql语句级的优化,我特意测试了两种方式,在StudentMapper中配置了两种insert模式。第一种对应insert value1,insert value2,,,,;第二种对应insert values (value1, value2,....)。发现后者果然比前者快很多啊。下面是两种insert模式,及测试结果对应图: 
      
      <!-- 在外部for循环调用一千次 -->
      <insert id="insert" parameterType="sdc.mybatis.test.Student">
      insert into student (id, name, sex,
      address, telephone, t_id
      )
      values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
      #{sex,jdbcType=VARCHAR},
      #{address,jdbcType=VARCHAR}, #{telephone,jdbcType=VARCHAR}, #{tId,jdbcType=INTEGER}
      )
      </insert>
      <!-- 批量 ,传入一个长度为1000的list -->
      <insert id="insertBatch">
      insert into student ( <include refid="Base_Column_List"/> ) 
      values 
      <foreach collection="list" item="item" index="index" separator=",">
      (null,#{item.name},#{item.sex},#{item.address},#{item.telephone},#{item.tId})
      </foreach>
      </insert>

161102、MyBatis中批量插入的更多相关文章

  1. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

  2. MyBatis中批量插入数据对插入记录数的限制

    <基于Mybatis框架的批量数据插入的性能问题的探讨>(作者:魏静敏 刘欢杰 来源:<计算机光盘软件与应用> 2013 年第 19 期)中提到批量插入的记录数不能超过1000 ...

  3. mybatis中批量插入以及更新

    1:批量插入 批量插入就是在预编译的时候,将代码进行拼接,然后在数据库执行 <insert id="batchInsert" parameterType="java ...

  4. 【mybatis】mybatis中批量插入 批量更新 batch 进行insert 和 update,或者切割LIst进行批量操作

    ================================================================== 分别展示 mybatis 批量新增  和 批量更新   的操作: ...

  5. mybatis中批量插入数据

    <insert id="insertIntoDevAct" parameterType="java.util.List"><foreach c ...

  6. MyBatis向数据库中批量插入数据

    Foreach标签 foreach: collection:指定要遍历的集合; 表示传入过来的参数的数据类型.该参数为必选.要做 foreach 的对象,作为入参时,List 对象默认用 list 代 ...

  7. Mybatis+mysql批量插入性能分析测试

    前言 今天在网上看到一篇文章(后文中的文章指的就是它) https://www.jianshu.com/p/cce617be9f9e 发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我 ...

  8. mybatis之批量插入

    一.导入功能优化 普通for循环,对于导入大量数据时非常耗时.可以通过Mybatis的批量插入功能提高效率.每批次导入的数据不能太多,否则会报错.通过测试发现,每批次200条为宜. 测试结果: 开启事 ...

  9. mysql基础---->mybatis的批量插入(一)

    这里面记录一下使用mybatis处理mysql的批量插入的问题,测试有可能不准.只愿世间风景千般万般熙攘过后,字里行间,人我两忘,相对无言. mybatis的批量插入 我们的测试主体类是springb ...

随机推荐

  1. SQLSERVER执行计划详解

    序言 本篇主要目的有二: 1.看懂t-sql的执行计划,明白执行计划中的一些常识. 2.能够分析执行计划,找到优化sql性能的思路或方案. 如果你对sql查询优化的理解或常识不是很深入,那么推荐几骗博 ...

  2. CAM350测量

    CAM350 测量方法 1. 单位设置:在菜单:Settings 下选中 Unit: 英制 公制 精确度 CAM350 软件默认的是英制,不习惯用英制的人,就改为公制的呀 软件默认的是英制 就改为公制 ...

  3. [OpenCV](1)安装与测试

    1.安装包下载地址:http://opencv.org/downloads.html 2.解压缩到D:\Program Files (x86) 3.添加环境变量:D:\Program Files (x ...

  4. css页面布局

    写在前面: 页面布局整体上可以分为两类:固定宽度(一般固定960px):流式布局:将流式布局转换为固定布局很容易,只需要外围再包括一个div,为其设置宽度即可. html默认的布局方式是将每个块状标签 ...

  5. uiwebview 兼容性 - IOS8及以上 WKWebView

    @import WKWebView; WKWebView *webView = [[WKWebView alloc]init......]; 使用. WKWebView兼容 IOS 及 OSX.IOS ...

  6. 通过SSIS监控远程服务器磁盘空间并发送邮件报警!

    由于之前ESB是供应商部署的,且部署在C盘(C盘空间很小,还添加了很多ESB的windows服务日志在C盘,很容易把C盘空间占满,导致ESB服务运行宕机,几乎每隔几周发生一次事故,需要人工干预处理,不 ...

  7. update kernel

    1,version 2,command First, verify the current kernel version: $ uname -r 2.6.32-358.el6.x86_64 Befor ...

  8. Java基础之写文件——使用Formatter对象加载缓冲区(UsingAFormatter)

    控制台程序,使用Formatter对象将写入文件的数据准备好. 使用Formatter对象的format()方法,将数据值格式化到视图缓冲区charBuf中. import static java.n ...

  9. Java相对路径读取文件

    不管你是新手还是老鸟,在程序中读取资源文件总会遇到一些找不到文件的问题,这与Java底层的实现有关,不能算bug,只要方法得当,问题还是可以解决的. 项目的文件夹结构: repathtest ├─sr ...

  10. android命令安装apk时报错:INSTALL_FAILED_CPU_ABI_INCOMPATIBLE

    点击下载Genymotion-ARM-Translation.zip 将你的虚拟器运行起来,将下载好的zip包用鼠标拖到虚拟机窗口中,出现确认对跨框点OK就行.然后重启你的虚拟机.