`
snoopy7713
  • 浏览: 1152309 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

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 >
    复制代码
     

附录:

  1. MyBatis配置文件的DTD文件(与Ibatis3不同):http://mybatis.org/dtd/
  2. MyBatis的中文手册:http://mybatis.googlecode.com/files/MyBatis%203%20User%20Guide%20Simplified%20Chinese.pdf
分享到:
评论

相关推荐

    mybatis plus 5种批量操作性能测试

    通过这样的测试,我们可以了解 MyBatis Plus 在不同批量操作模式下的性能特性,为实际项目中的数据处理提供决策支持。在实际开发中,根据数据量、系统资源和业务需求选择合适的批量操作方式,可以有效地提升系统的...

    mybatis数据操作(增删改查+批量操作)

    在"mybatis数据操作(增删改查+批量操作)"这个主题中,我们将深入探讨如何利用MyBatis进行基本的数据操作,包括插入(Insert)、删除(Delete)、更新(Update)和查询(Select),以及如何执行批量操作。...

    Java实现mybatis批量插入数据到Oracle

    本篇文章将详细介绍如何利用Java和MyBatis实现批量插入数据到Oracle数据库中。 首先,我们需要理解Oracle数据库的一些基本概念。Oracle是世界上最流行的商业关系型数据库管理系统之一,以其强大的功能和高可靠性而...

    mybatis批量添加数据的方法1

    MyBatis批量添加数据的方法 MyBatis是一款流行的Java持久层框架,它提供了多种方式来批量添加数据,以下是其中两种常用的方法: 方法一:使用foreach标签 在MyBatis中,我们可以使用foreach标签来批量添加数据。...

    Mybatis与JDBC批量插入MySQL数据库性能测试

    在数据库操作中,批量插入(Batch Insert)是一种提高性能的有效方式,尤其是在处理大量数据时。本文将探讨Mybatis和JDBC在批量插入MySQL数据库时的性能差异,并提供相关的测试资源。 首先,JDBC(Java Database ...

    Mybatis批量foreach merge into的用法

    Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不存在则插入。下面是该方法的详细介绍: ...

    Mybatis Plus 自定义批量插入或批量更新(根据唯一索引)

    Mybatis Plus 是 Mybatis 的一个扩展工具,它在 Mybatis 的基础上提供了许多便捷的功能,包括自动 CRUD 操作、条件构造器、批量操作等。在实际的项目开发中,批量插入和批量更新是常见的数据处理场景,尤其是在处理...

    mybatis批量增删改.txt

    mybatis 框架批量增删改代码 示例 含java与xml

    MyBatis防止批量更新1

    MyBatis 插件机制防止批量更新 MyBatis 是一个流行的持久层框架,它提供了插件机制来拦截 SQL 操作,以便于开发者可以在执行 SQL 语句前进行预处理或后续处理。本文将详细介绍 MyBatis 插件机制的实现原理和应用...

    mybatis postgresql 批量删除操作方法

    MyBatis PostgreSQL 批量删除操作方法 MyBatis 是一个基于 Java 的持久层框架,它提供了一个简单的方式来交互数据库。在本文中,我们将介绍如何使用 MyBatis 实现 PostgreSQL 批量删除操作。 PostgreSQL 简介 ...

    mybatis foreach批量插入数据:Oracle与MySQL区别介绍

    MyBatis foreach批量插入数据:Oracle与MySQL区别介绍 MyBatis foreach批量插入数据是一种高效的数据批量插入方式,通过foreach标签可以实现批量插入数据。但是,在不同的数据库管理系统中,foreach标签的使用有...

    mybatis 批量插入返回主键

    只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢只提供代码,自己去下载相关jar包谢谢

    mybatis 通用分页插件和批量操作插件

    NULL 博文链接:https://hzs0502030128.iteye.com/blog/2254585

    SpringBoot使用mybatis批量新增500万数据到mysql数据库Demo

    在本项目中,我们主要探讨的是如何利用SpringBoot集成Mybatis框架进行大数据量(例如500万条)的批量插入操作,并将其高效地存入MySQL数据库。这个Demo旨在提供一个学习实例,帮助开发者理解并优化大数据处理的性能...

    Mybatis框架(批量添加)

    Mybatis框架(批量添加)

    mybatis学习之路mysql批量新增数据的方法

    MyBatis批量新增数据方法详解 MyBatis是当前流行的持久层框架之一,提供了批量新增数据的方法来提高数据insert的效率。在本文中,我们将详细介绍MyBatis批量新增数据的方法,并对比单条insert和批量insert的效率。 ...

    基于mybatis batch实现批量提交大量数据

    MyBatis批量提交大量数据是一种高效的数据批量操作方式,通过MyBatis的BATCH方式执行增删改方法,可以实现在短时间内处理大量数据。下面对MyBatis批量提交大量数据的实现进行了详细的介绍。 MyBatis批量提交的优点 ...

    mybatis批量添加

    mybatis批量添加的时候报错总结报错 parameter'_frch_item_0 not found

    MyBatis批量插入(insert)数据操作

    此外,对于支持批量操作的数据库(如MySQL),还可以利用数据库级别的批量插入API来进一步提升性能。 总的来说,MyBatis的批量插入功能结合了Java代码的灵活性和SQL的高效性,是处理大批量数据插入的理想选择。通过...

Global site tag (gtag.js) - Google Analytics