`
hekuilove
  • 浏览: 159146 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

使用Mybatis做批量插入

阅读更多
最近有个需求,将excel的数据导入的数据库的这个一个操作。
工作主要分为:解析excel,将excel中的数据单条循环插入数据库。
使用框架:mybatis+spring
使用过Mybatis的人都知道,自动生成的Mapper里是不支持批量插入的,也不支持SQL。这个让我有点小小的郁闷,网上查资料发现对这方面的资料颇少。于是决定写一篇blog案例分享心得。
或许有人要问既然Mybatis既然支持插入了,为何非要要使用批量插入。我这里的excel中的数据最少也是上W条,如果是使用单条循环插入的话会对数据库造成很大的负荷状态,数据库的连接资源是有限的,循环插入的时候会直接的影响其它的数据库操作。
pojo
package me.gall.business.model.mybatis.bean;

/**
 * @author Quinn He
 * @dateTime 2012-2-9 下午4:35:18
 *
 */
public class ApkStatisticRaw {

	private Integer id;
	private String uuid;
	private String apkId;
	private String eventId;
	private Integer supplyId;
	private Integer channelId;
	private String fileUploadRecordId;
	private String productName;
	private String content;
	private Long time;
	private Integer numbers;
	private Integer status;
	private String creator;
	private Long createTime;
	private String other;

	set...
         get...


}


interface
import me.gall.business.model.mybatis.bean.ApkStatisticRaw;

/**
 * @author Quinn He
 * @dateTime 2012-2-20 下午7:48:39
 */
public interface ApkStatisticRawExtMapper {

/**
	 * 专门针对在导入CSV文件时
	 * 频繁操作数据库造成的数据库并发问题
	 * 固此方法为批量插入方法
	 * 
	 * @author Quinn He
	 * @dateTime 2012-3-30 上午11:34:22
	 * @param list
	 */
	void batchInsert(List<ApkStatisticRaw> list);
}

再看看XML里的操作
<select id="batchInsert" parameterType="java.util.List">
		insert into apk_statistic_raw
		(uuid,apk_id,event_id,supply_id,channel_id,file_upload_record_id,product_name,content,time,numbers,status,creator,create_time,other
		)values
		<foreach collection="list" item="item" index="index"
			separator=",">
			(#{item.uuid,jdbcType=CHAR},#{item.apkId,jdbcType=CHAR},#{item.eventId,jdbcType=CHAR},#{item.supplyId,jdbcType=INTEGER},#{item.channelId,jdbcType=INTEGER}
			,#{item.fileUploadRecordId,jdbcType=CHAR},#{item.productName,jdbcType=VARCHAR},#{item.content,jdbcType=VARCHAR},#{item.time,jdbcType=BIGINT},
			#{item.numbers,jdbcType=INTEGER},#{item.status,jdbcType=INTEGER},#{item.creator,jdbcType=VARCHAR},#{item.createTime,jdbcType=BIGINT},#{item.other,jdbcType=VARCHAR}
			)
		</foreach>
	</select>
	

如此简单的操作,我也不做多说吧。相信都能看懂#{item.uuid,jdbcType=CHAR}其中uuid是对象的字段,CHAR是对应的数据库字段类型
分享到:
评论
15 楼 renzhengzhi 2015-08-24  
mybatis的这个批量insert为什么不是在一个事务里?
14 楼 hekuilove 2014-03-20  
恋上你的味道 写道
花家狗V587 一统江湖

聋家狗 FU*CK YOU
13 楼 恋上你的味道 2014-03-20  
花家狗V587 一统江湖
12 楼 hekuilove 2014-01-21  
qianmo666 写道
最大插入量是多少?

我当时的业务是导入csv到数据库里,当时一个excel多则上百万条,少则几万条
,由于太多,我就1000条一次执行一次批量,插完为止。。
当时用的数据库是MySQL,我最近用oracle也有一个类似的情况想这样干结果不行了,oracle不支持这种语法
11 楼 qianmo666 2014-01-06  
最大插入量是多少?
10 楼 RyanLu 2013-01-09  
请问如果我的ID是自增长的,我批量插入的时候,每个domain object的id,能返回吗?尝试过在里面加<select key>好像不起作用。我用是sql server 2005

  
<insert id="batchInsert" parameterType="java.util.List">
    <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">  
        SELECT SCOPE_IDENTITY() AS id  
    </selectKey>  
   	<foreach collection="list" item="item" index="index" separator=" ">
      insert into itd.Approval (ApplicationId, ApproverId, ApproverProjectId, Priority, Status,  ApprovedTime, Comments) select #{item.applicationId,jdbcType=INTEGER}, #{item.approverId,jdbcType=INTEGER}, #{item.approverProjectId,jdbcType=INTEGER}, #{item.priority,jdbcType=INTEGER}, #{item.status,jdbcType=CHAR}, #{item.approvedTime,jdbcType=TIMESTAMP}, #{item.comments,jdbcType=NVARCHAR}
    </foreach>
  </insert>
9 楼 zq93741833 2012-11-23  
小五哥丶 写道
妹的,全是SELECT,

select标签里面是可以包含insert语句
8 楼 hekuilove 2012-11-06  
hanzhicheng754 写道
哥们,你插入的最大量是多少?

我是把大量的数据拆开来N个1000条来执行的,执行N次
7 楼 hanzhicheng754 2012-11-05  
哥们,你插入的最大量是多少?
6 楼 hekuilove 2012-10-24  
natian306 写道
select? 确定不是insert? 楼主是否直接用的mapper操作? 是否有dao的实现类?

当然确定,select一样一样的。。insert也行。。没实现类
5 楼 natian306 2012-10-21  
select? 确定不是insert? 楼主是否直接用的mapper操作? 是否有dao的实现类?
4 楼 hekuilove 2012-10-11  
kingliu 写道
哥们儿,你用的什么数据库,我用sybase发现不行啊

我的是MySQL
3 楼 kingliu 2012-10-11  
哥们儿,你用的什么数据库,我用sybase发现不行啊
2 楼 j315321 2012-05-22  
能不能把批量操作的java方法贴出来看看,谢……
1 楼 小五哥丶 2012-04-20  
妹的,全是SELECT,

相关推荐

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

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

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

    代码部分包含了使用JDBC和Mybatis进行批量插入的示例,你可以直接运行这些代码进行测试。同时,数据库脚本和初始数据也在其中,确保了测试的一致性和可重复性。 通过这样的性能测试,我们可以了解到在特定场景下,...

    spring中使用mybatis实现批量插入的示例代码

    Spring 中使用 MyBatis 实现批量插入的示例代码 一、前言 在实际开发中,批量插入数据是非常常见的需求。使用 Spring 框架结合 MyBatis 框架,可以实现高效的批量插入操作。本文将详细介绍 Spring 中使用 MyBatis ...

    Mybatis实现多表联合查询和批量插入

    本文将详细介绍如何使用Mybatis实现多表联合查询和批量插入。 一、多表联合查询 在实际开发中,经常需要对多个表进行联合查询,例如,查询员工信息同时需要关联部门信息和职位信息。Mybatis提供了强大的联合查询...

    mybatispuls3.5使用批量插入

    下面我们将详细介绍如何在MyBatisPlus 3.5中使用批量插入: 1. 引入依赖: 首先,你需要在项目中引入MyBatisPlus的依赖。如果使用Maven,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;...

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

    本文将深入探讨如何在 Mybatis Plus 中自定义批量插入和批量更新,并根据唯一索引来确保数据的唯一性。 首先,了解 Mybatis Plus 的批量操作基础。Mybatis Plus 提供了 `batchInsert()` 和 `batchUpdate()` 方法来...

    Java使用Mybatis将数据批量插入到Oracle

    Java实现使用Mybatis将数据批量插入到Oracle数据库,并且可以使用Oracle序列来生成主键

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

    但是,在不同的数据库管理系统中,foreach标签的使用有一些区别,今天我们主要介绍MyBatis foreach批量插入数据在Oracle和MySQL中的区别。 首先,让我们先了解一下foreach标签的基本使用方法。foreach标签是MyBatis...

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

    批量插入使用`ExecutorType.BATCH` 的一个示例代码如下: ```java @Autowired private SqlSessionTemplate sqlSessionTemplate; // 获取一个BATCH模式且自动提交为false的session SqlSession session = ...

    MyBatis批量插入Update

    在实际测试中,使用MyBatis批量插入可以达到至少快一倍的执行效率。 MyBatis批量插入的实现可以通过使用foreach标签来实现。在XML配置文件中,我们可以使用foreach标签来批量插入数据。例如: ```xml insert into...

    mybatis 批量插入返回主键

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

    Mybatis 3+Mysql 实现批量插入

    本文将深入探讨如何利用MyBatis框架结合MySQL数据库实现批量插入功能,包括其原理、配置、代码实现以及优化策略。 ### 一、MyBatis框架简介 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级...

    mybatis-generator,一对一,一对多,批量更新插入2

    使用方法请看博客 https://blog.csdn.net/bandaotixiruiqiang/article/details/72478361#comments_12931827

    SpringBoot整合Mybatis连接SQL Server 跨库批量插入

    本篇将深入探讨如何在Spring Boot项目中整合Mybatis,实现对SQL Server数据库的跨库批量插入操作。 首先,我们需要在Spring Boot项目中引入相关的依赖。对于Mybatis的支持,我们需要添加Mybatis和其Spring Boot ...

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    本文将详细介绍如何利用MyBatis结合多线程和CountDownLatch闭锁来实现数据的批量插入。 首先,我们来看`mybatis批处理`。MyBatis的批处理功能允许我们在一次数据库连接中执行多条SQL语句,从而减少了数据库连接的...

    MyBatis动态SQL,MyBatis批量插入(Oracle数据库)[收集].pdf

    MyBatis动态SQL和批量插入的应用 MyBatis是一款功能强大且灵活的持久层框架,提供了多种方式来对数据库进行交互。其中,动态SQL是一种非常强大的特性,能够根据不同的条件生成不同的SQL语句。下面将详细介绍MyBatis...

    Mybatis数据批量插入如何实现

    本文将详细介绍如何使用Mybatis实现数据批量插入。 使用foreach标签实现批量插入 在Mybatis中,可以使用foreach标签来实现数据批量插入。foreach标签可以对一个集合进行迭代,并生成相应的SQL语句。下面是一个简单...

    mybatisr代码生成插件(中文注释,生成批量插入及修改)

    总的来说,"mybatis-generator代码生成插件(中文注释,生成批量插入及修改)"是一款强大的开发辅助工具,它通过自动化代码生成,降低了开发难度,提高了代码质量,尤其是在处理复杂数据关系和大量数据操作时,其...

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

    4. **使用 SQL 批量插入(SQL Batch Insert)** MyBatis Plus 支持自定义 SQL,可以通过 `executeBatch()` 执行批量 SQL 语句,如 `INSERT INTO table (column1, column2) VALUES (?, ?), (?, ?), ...` 这种形式,...

    MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)

    在使用MyBatis批量插入数据到Oracle数据库时,需要将useGeneratedKeys设置为false,以避免主键冲突的错误。 本文分享了MyBatis批量插入数据到Oracle数据库中的两种方式,希望对大家有所帮助。如果您有任何疑问,请...

Global site tag (gtag.js) - Google Analytics