MyBatis批量插入数据

MyBatis批量插入,10秒内十万条数据插入,及性能测试 本文介绍了 MyBatis 批量插入的 3 种方法,其中循环单次插入的性能最低,也是最不可取的;使用 MyBatis 拼接原生 SQL 一次性插入的方法性能最高,但此方法可能会导致程序执行报错(触发了数据库最大执行 SQL 大小的限制),所以综合以上情况,可以考虑使用 Mybatis-Plus 的批量插入功能。 阅读详情

在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,由于项目使用了Spring+MyBatis的配置,所以打算使用MyBatis批量插入,由于之前没用过批量插入,在网上找了一些资料后最终实现了,把详细过程贴出来。

 

实体类TrainRecord结构如下:

 

Java代码  收藏代码
  1. public class TrainRecord implements Serializable {  
  2.   
  3.     private static final long serialVersionUID = -1206960462117924923L;  
  4.   
  5.     private long id;  
  6.   
  7.     private long activityId;  
  8.   
  9.     private long empId;  
  10.   
  11.     private int flag;  
  12.   
  13.     private String addTime;  
  14.           
  15.     //setter and getter   
  16.       
  17. }  

 

对应的mapper.xml中定义如下:

 

Xml代码  收藏代码
  1. <resultMap type="TrainRecord" id="trainRecordResultMap">  
  2.     <id column="id" property="id" jdbcType="BIGINT" />  
  3.     <result column="add_time" property="addTime" jdbcType="VARCHAR" />  
  4.     <result column="emp_id" property="empId" jdbcType="BIGINT" />  
  5.     <result column="activity_id" property="activityId" jdbcType="BIGINT" />  
  6.     <result column="flag" property="status" jdbcType="VARCHAR" />  
  7. </resultMap>  

 

mapper.xml中批量插入方法的定义如下:

 

Xml代码  收藏代码
  1. <insert id="addTrainRecordBatch" useGeneratedKeys="true" parameterType="java.util.List">  
  2.     <selectKey resultType="long" keyProperty="id" order="AFTER">  
  3.         SELECT  
  4.         LAST_INSERT_ID()  
  5.     </selectKey>  
  6.     insert into t_train_record (add_time,emp_id,activity_id,flag)   
  7.     values  
  8.     <foreach collection="list" item="item" index="index" separator="," >  
  9.         (#{item.addTime},#{item.empId},#{item.activityId},#{item.flag})  
  10.     </foreach>  
  11. </insert>  
 

对于foreach标签的解释参考了网上的资料,具体如下:

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

 

1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map

关于foreach的具体例子在这里就先不举,以后有机会可以把每一种情况都举一个例子列出来。

 

 

MysqlBaseDAO:

Java代码  收藏代码
  1. public class MySqlBaseDAO extends SqlSessionDaoSupport {  
  2.     /** 
  3.      * insert:插入操作. <br/> 
  4.      * 
  5.      * @author chenzhou 
  6.      * @param method 插入操作的方法名 
  7.      * @param entity 查询参数或实体类 
  8.      * @return 返回影响的行数 
  9.      * @since JDK 1.6 
  10.      */  
  11.     public int insert(String method,Object entity){  
  12.         return this.getSqlSession().insert(method, entity);  
  13.     }  
  14.           
  15.     //其余方法省略  
  16. }  

TrainRecord实体类对应的TrainRecordDAO 定义如下:

 

Java代码  收藏代码
  1. public class TrainRecordDAO extends MySqlBaseDAO {  
  2.     /** 
  3.      * addTrainRecordBatch:批量插入培训记录. <br/> 
  4.      * 
  5.      * @author chenzhou 
  6.      * @param trainRecordList 培训记录list集合 
  7.      * @return 影响的行数 
  8.      * @since JDK 1.6 
  9.      */  
  10.     public int addTrainRecordBatch(List<TrainRecord> trainRecordList){  
  11.         return this.insert("addTrainRecordBatch", trainRecordList);  
  12.     }  
  13.       
  14.     //省略其余的方法  
  15. }  

 

然后直接调用TrainRecordDAO 中的 addTrainRecordBatch方法就可以批量插入了。

 

特别说明的是在尝试时碰到了一个让人无语的错误,折腾了我差不多1个小时才解决。就是我在定义mapper.xml中的插入方法时一般都会默认用<![CDATA[ ]]>标签把sql语句括起来,如下所示:

 

Xml代码  收藏代码
  1. <![CDATA[ 
  2.     select * from t_train_record t where t.activity_id=#{activityId} 
  3. ]]>  

这样做的目的主要是因为在 XML 元素中,"<" 和 "&" 是非法的。"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。而sql语句或者脚本语句中可能会存在 "<" 或 "&" 字符。为了避免错误,可以将sql语句定义为 CDATA。CDATA 部分中的所有内容都会被解析器忽略。

 

当时我在addTrainRecordBatch方法中也用了这种用法:

 

Xml代码  收藏代码
  1. <![CDATA[ 
  2.     insert into t_train_record (add_time,emp_id,activity_id,flag)  
  3.     values 
  4.     <foreach collection="list" item="item" index="index" separator="," > 
  5.         (#{item.addTime},#{item.empId},#{item.activityId},#{item.flag}) 
  6.     </foreach> 
  7. ]]>  

结果程序在执行时老是报错: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException,查看错误信息就是传入的参数都是null。纠结了很久,后面才发现原来是<![CDATA[ ]]>把xml中的<foreach>标签括起来后把标签直接当成字符串处理了。后面把外面的<![CDATA[ ]]>去掉后就能正常执行了。

QT触摸屏开发:如何通过重写事件处理实现精准按键长按检测 本文针对QT触摸屏开发中按键长按检测不精准的常见问题,深入剖析了传统信号机制失效的原因,并提供了通过重写事件处理函数(event)的解决方案。文章详细介绍了创建自定义TouchButton类、直接处理QTouchEvent以实现可靠长按检测的完整步骤与代码示例,并分享了进阶优化与避坑指南,帮助开发者实现跨平台一致的精准交互。 阅读详情

相关推荐

PC网站实现微信扫码登录功能(二)

上篇我们介绍了怎么申请账号以及最后拿到appId和appSecret,如果有不清楚的可以看一下 PC网站实现微信扫码登录功能(一) 下面我就来说一下怎样在PC端怎么实现扫码登录功能。 一、进入官方文档网站 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html 其实官网对过程描述的已经非常细致了。并且提供了两种扫码方式。一种是跳转二维码扫描页面,另一种是内嵌式二维码。大家可以

qq_35771266的博客 3万+

使用 MyBatis 进行批量插入操作

首先,在Mapper XML文件中定义批量插入的SQL语句。通常,您会使用元素来执行插入操作,并使用MyBatis的foreach标签来迭代要插入的数据集合。

徐师兄的博客 1082

TMC5160 StallGuard2调参避坑指南:从SG_RESULT飘忽不定到稳定检测堵转

本文详细解析了TMC5160的StallGuard2功能在堵转测试中的调参技巧,从SG_RESULT波动问题到稳定检测的完整解决方案。通过电流环与反电动势分析、电源噪声处理及低速校准法等实用方法,帮助工程师实现工业级可靠的堵转检测,避免误触发和检测失效问题。

weixin_28727975的博客 382

MyBatis批量插入的五种方式

MyBatis批量插入的五种方式

北执南念的博客 1万+

UDS(三)网络层时间参数

网络层定义了N_Ar、N_As、N_Br、N_Bs、N_Cr、N_Cs六个时间参数。 网络层在检测到错误的时间传递至上层使用者 1.当N_As 超时时,即发送方没有及时发送出N_PDU,系统将放弃信息的接收并传递<N_Result> = <N_TIMEOUT_A>的N_USData.comfirm指示 2.当N_Ar超时时,即接收方没有及时发送出N_PDU,系统将放弃信息的接收并传递<N_Result> = <N_TIMEOUT_A>的N_USData.co

weixin_44522306的博客 1万+

Elsevier投稿别再踩坑了!手把手教你搞定LaTeX模板和所有附件(附避坑清单)

本文详细解析Elsevier投稿全流程中的关键环节,特别是LaTeX模板的使用和系统提交的常见问题。从必备文件准备到LaTeX模板适配,再到投稿系统操作指南,提供全面的避坑清单和实用技巧,帮助科研工作者高效完成投稿,避免因格式错误或文件遗漏导致的退稿风险。

weixin_30915275的博客 552

Mybatis是什么?

Mybatis是什么?

weixin_69797860的博客 958

springboot&mybatis中数组和字符串数据类型的转换

/前端数组字段//数据库中字段/*与前端交互时使用的get/set*/System.out.println("接收前端数据");/*与前端交互时使用的get/set*//*与数据库交互时使用的get/set*/System.out.println("从数据库中读取数据");/*与数据库交互时使用的get/set*/

l_q_l的专栏 2476

Java的mybatis实现使用List批量插入实体类对象实操记录,collection=“list“

List批量插入 ,collection填collection="list"

YQAC996的博客 180

【QT开发教程】Qt中的数据加密与解密

在现代应用程序中,数据加密与解密是保护敏感信息的重要手段。Qt本身并不直接提供数据加密与解密的支持,但可以使用第三方库,如OpenSSL或Crypto++,来实现这一功能。本文将介绍如何在Qt中使用OpenSSL进行数据加密与解密,包括基本概念、使用方法以及一些实际的示例。

科技改变人类,技术成就未来 1157

openclaw通俗入门系列9——流式传输 + 分块

流式传输 = 不等写完就开始发。分块流式传输是把长回复切成几条消息发(所有渠道),草稿流式传输是像打字一样实时显示(仅 Telegram)。可以配置块大小、发送时机、合并规则、类人延迟。

m0_60605453的博客 507

Mybatis 批量插入数据 SQL

上面代码中在 SQL 语句的最外层使用了 for 循环,好处是将 List 类型的集合传递来写入数据时可以有的是新增有的是修改,例如3行数据,第一三行由于主键字段对应属性 sid 被设置为 NULL ,会向数据库中新增行,第二行数据设置了 sid ,并且该值在数据库中有对应行,那么会修改数据库中的该行上的数据。通过在 java 中测试,发现上面的语句新增一行成功后会返回1,修改成功后会返回2(这里有疑惑,如果清楚原因的麻烦跟帖科普下)。这种写法适合插入数据的项不变,

zzhongcy的专栏 4646

目标检测YOLO实战应用案例100讲-【目标检测】缺陷检测(二)

在工业生产中总是经常遇到裂痕、划痕等产品的表面缺陷问题,机器视觉行业对于表面检测相比前几年已经有很大的突破,对于产品表面的划伤、污迹等检测已经不再是难点。在金属、玻璃、手机屏幕、液晶板等行业表面检测上应用广泛。但由于该类缺陷形状不规则、深浅对比度低,而且往往会被产品表面的自然纹理或图案所干扰。因此,表面划痕缺陷检测对于正确打光、相机分辨率、被检测部件与工业相机的相对位置、复杂的机器视觉算法等要求非常高。

qq_36130719的博客 729

Mybatis批量插入数据的两种方式

用mybatis有两种批量插入数据的方式可选:1. 拼接批量插入多条数据的SQL. 2. 使用Batch Insert技术。

Neo.Yang的专栏 5万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Mybatis 三种批量插入数据 方式

1. 循环插入 mapper.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.buhe.demo.mapper.StudentMapper"> <inser

6万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Mybatis如何批量插入数据?

    有一小段时间没有写技术博文了,今天我又来更新啦😊😊😊5月份中间有个小插曲,那就是我在单位打球意外导致脚跟腱受伤,然后住院在家修养了一个多月了,所以小伙伴们在外锻炼时还是时刻注意自身的安全哦!6月份这一个月都是居家办公的状态,庆幸自己是计算机专业的,不然可惨了!😂😂😂     记录最近工作中遇到的问题以及解决的办法,也就是今天的主题:Mybatis批量插入数据。    数据的单条插入,小伙伴应该对此并不陌生了,因为在之前的博文中已经介绍过如何进行基础的增加数据过程,这里不再累赘,如果这部分......

Fish_Vast的博客 7006

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MyBatis 批量插入大批量数据 数据过多问题

MyBatis 批量插入大批量数据 场景:导入excel表格,读取数据,再批量插入数据库 service关键代码如下 传入List集合,直接插入数据 bindCardInsertLogMapper.batchInsertHzjjBindCodeLog(list); 刚开始调用接口没有什么问题一切正常,后来一次导入300条数据直接报错: 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100 查阅资料才发现原来Mybatis调用SQL SER

ChenLong_0317的博客 3207

MyBatis 批量插入数据的 3 种方法

批量插入功能是我们日常工作中比较常见的业务功能之一,今天来一个 MyBatis 批量插入的汇总篇,同时对 3 种实现方法做一个性能测试,以及相应的原理分析。 先来简单说一下 3 种批量插入功能分别是: 循环单次插入; MP 批量插入功能; 原生批量插入功能。 准备工作 开始之前我们先来创建数据库和测试数据,执行的 SQL 脚本如下: -- ---------------------------- -- 创建数据库 -- ---------------------------- SET NAMES utf

佳佳乐的博客 2万+

Mybatis批量插入数据

开源字节使用MyBatis foreach标签方式优雅的实现了材料的出入库

詹Sir的博客 7033

Mybatis 批量插入数据

mybatis 批量插入

weixin_43368449的博客 1331

mybatis针对oracle批量插入数据

在Oracle中,insert批量插入数据: INSERT ALL INTO A(field_1,field_2) VALUES (value_1,value_2) INTO A(field_1,field_2) VALUES (value_3,value_4) INTO A(field_1,field_2) VALUES (value_5,value_6) SELECT 1 FROM ...

Eddie-Wang的博客 1950

MyBatis批量插入数据到数据库

一、SQL层面先复习一下单条/批量插入数据的sql语句怎么写:1. 单条插入数据的写法:INSERT INTO [表名]([列名],[列名])  VALUES([列值],[列值]))2.一次性批量插入数据的sql语句的写法:INSERT INTO [表名]([列名],[列名])  VALUES([列值],[列值])),([列值],[列值])),([列值],[列值]));批量的好处:可以避免程序和数...

NNnora的博客 3万+

Mybatis批量插入数据对比

前言 业务场景中有很多批量插入数据的场景: 比如:数据库需要造几百万条数据,又或者excel批量导入数据… 这里主要讲使用MyBatis批量导入数据的两种方式,及对比。 环境与数据准备 数据库统一使用了MySQL 5.7.31 ,JDK 1.8,关键pom依赖版本: <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>

长得赛的博客 526
上一篇: mybatis 批量增加 Parameter '__frch_item_0' not found. Available parameters are [list]
下一篇: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值