Mybatis如何批量插入数据?

article/2025/9/13 20:49:48

    有一小段时间没有写技术博文了,今天我又来更新啦😊😊😊5月份中间有个小插曲,那就是我在单位打球意外导致脚跟腱受伤,然后住院在家修养了一个多月了,所以小伙伴们在外锻炼时还是时刻注意自身的安全哦!6月份这一个月都是居家办公的状态,庆幸自己是计算机专业的,不然可惨了!😂😂😂
    记录最近工作中遇到的问题以及解决的办法,也就是今天的主题:Mybatis批量插入数据。

✈️数据单条插入

    数据的单条插入,小伙伴应该对此并不陌生了,因为在之前的博文中已经介绍过如何进行基础的增加数据过程,这里不再累赘,如果这部分内容忘记的小伙伴可以参考此条链接:SpringBoot_实现基本增删改查(前后端分离版),中间本人已经描述清楚了!
    不过,随着项目越做越多,深度也越来越来大,基本的插入数据量还是偏小,如果我们项目需要我们一次性插入成百上千的数据呢?单条数据是不够看啦,问题引入进来,如何插入批量数据呢?

🚀数据批量插入

    单条插入的速度我们如果用飞机的速度描述,那么批量插入的速度就是火箭。为何这样子说呢?因为本人亲身经历过,在这之前没有仔细了解过批量插入,单条的速度就能满足我当前接手项目中的需求,一般的业务批量插入的情况少嘛!但是6月份需要做的事情中当前数据暂无,大量的数据只能通过我在代码层面进行模拟生成,涉及到每年每月每天每小时的数据,数据量可想而知,一条条插入到数据库中来,即便是我们加上了时间索引,速度还是想蜗牛爬似的。

    话不多说,直接上批量插入的用法:

🔔 ① Mapper接口层插入集合

    批量的意思就是多条数据一并插入于数据库之中,那么我们传入到数据库肯定就是以集合传值。批量插入数据时不能像单条数据一样插入一个对象了,如下例所示为单条模拟增加和多条模拟增加数据的区分:

    /** 单条模拟增加数据 */public int insertSimulationData(TunnelDetectData tunnelDetectData);/** 多条模拟增加数据 */public int insertSimulationDataList(List<TunnelDetectData> tunnelDetectDataList);

🔔 ② Mybatis层批量foreach插入

    以下将通过单条数据插入和批量插入做对比分析,代码实例如下:
(1)单条数据插入:
    单条的数据插入注意因为id是自增的,所以加入<selectKey></selectKey>等让主键id自增,数据库层面也要将主键id设置为自动新增,否则程序会报错!

<insert id="insertSimulationData" parameterType="com.yh.domain.TunnelDetectData" keyProperty="id" useGeneratedKeys="true"><selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">SELECT LAST_INSERT_ID() as id</selectKey>insert into tunnel_detect_data<trim prefix="(" suffix=")" suffixOverrides="," ><if test="id != null" >id,</if><if test="stakeNo != null" >stake_no,</if><if test="deviceNo != null" >device_no,</if><if test="deviceName != null" >device_name,</if><if test="tunnelName != null" >tunnel_name,</if><if test="direction != null" >direction,</if><if test="commandType != null" >command_type,</if><if test="currentData != null" >current_data,</if><if test="createTime != null" >create_time,</if><if test="acquisitionTime != null" >acquisition_time,</if><if test="loadTime != null" >load_time,</if><if test="remark1 != null" >remark1,</if><if test="remark2 != null" >remark2,</if><if test="remark3 != null" >remark3,</if></trim><trim prefix="values (" suffix=")" suffixOverrides="," ><if test="id != null" >#{id,jdbcType=BIGINT},</if><if test="stakeNo != null" >#{stakeNo,jdbcType=VARCHAR},</if><if test="deviceNo != null" >#{deviceNo,jdbcType=VARCHAR},</if><if test="deviceName != null" >#{deviceName,jdbcType=VARCHAR},</if><if test="tunnelName != null" >#{tunnelName,jdbcType=VARCHAR},</if><if test="direction != null" >#{direction,jdbcType=INTEGER},</if><if test="commandType != null" >#{commandType,jdbcType=VARCHAR},</if><if test="currentData != null" >#{currentData,jdbcType=VARCHAR},</if><if test="createTime != null" >#{createTime,jdbcType=TIMESTAMP},</if><if test="acquisitionTime != null" >#{acquisitionTime,jdbcType=TIMESTAMP},</if><if test="loadTime != null" >#{loadTime,jdbcType=TIMESTAMP},</if><if test="remark1 != null" >#{remark1,jdbcType=VARCHAR},</if><if test="remark2 != null" >#{remark2,jdbcType=VARCHAR},</if><if test="remark3 != null" >#{remark3,jdbcType=VARCHAR},</if></trim></insert>

(2)多条数据批量插入:
    多条数据批量插入的写法有所不同,以集合的形式插入,需要借助<foreach></foreach>,代码实例如下所示:
注意<foreach></foreach>键值对中各个参数的写法:
    📣collection:为必填值,值为要迭代循环的集合类型,情况有多种:
    入参是List类型的时候,collection属性值为list,这里是否可换其他自定义值,我还未亲测过,好像有大佬们换过吧?😜
    入参是Map类型的时候,collection 属性值为map的key值。
    📣item:每一个元素进行迭代时的别名,可自行定义,省事就直接用“item”即可。
    📣index:索引的属性名,在集合数组情况下值为当前索引值,当迭代对象是map时,这个值是map的key。
    📣separator: 每次循环的分隔符。

<insert id="insertSimulationDataList" >insert into tunnel_detect_data(stake_no, device_no,device_name, tunnel_name, direction,command_type, current_data, create_time,acquisition_time, load_time, remark1,remark2, remark3)values<foreach collection="list" separator="," index="index" item="item">(#{item.stakeNo},#{item.deviceNo},#{item.deviceName},#{item.tunnelName},#{item.direction},#{item.commandType},#{item.currentData},#{item.createTime},#{item.acquisitionTime},#{item.loadTime},#{item.remark1},#{item.remark2},#{item.remark3})</foreach></insert>

    路过的小伙伴,如果博文有帮助到你解决问题,可以点赞+收藏+关注一波呀~本人将会持续更新相关学习博文,感谢您的支持哦!!!芜湖起飞✈️✈️✈️
在这里插入图片描述


http://chatgpt.dhexx.cn/article/MeHDKIhY.shtml

相关文章

MYSQL-批量插入数据

批量插入数据 存储过程也有返回值&#xff0c;存储过程有一个或多个返回值&#xff0c;函数有且只有一个返回值 往表里插入1000w数据 1.建表 create database bigData; use bigData;create table dept( id int unsigned primary key auto_increment, deptno mediumint unsi…

Mybatis批量插入数据

前言 在很多业务场景中&#xff0c;我们需要批量录入数据。那么意味着我们需要以最高效的方式去实现功能&#xff0c;同时也需要保证软件的便捷性与可维护性&#xff0c;开源字节使用MyBatis foreach标签方式优雅的实现了材料的出入库。源码开放&#xff0c;可前往码云仓库免费…

批量插入

目录 一、批量插入数据 ⚪JDBC的批量处理语句的方法 二、高效的批量插入 1.举例&#xff1a;向goods表中插入20000条数据 ⭐goods表的创建 方式一&#xff1a;使用Statement 方式二&#xff1a; 使用PreparedStatement替换Statement &#x1f319;方式一与方式二的对比…

三种批量插入数据的方法

批量插入数据 本文将介绍三种批量插入数据的方法。第一种方法是使用循环语句逐个将数据项插入到数据库中&#xff1b;第二种方法使用的是SqlBulkCopy&#xff0c;使您可以用其他源的数据有效批量加载 SQL Server 表&#xff1b;第三种使用的方法是sql server中的表值参数方法&a…

Vue 通过a标签下载文件

vue前端点击某个a便签需要下载对应文件&#xff0c;href为下载路径&#xff0c;download为下载文件名 这是Vue-cli3 写法 因为public文件夹是静态拷贝。 并不要把文件放到src>assets里面 因为assets中的文件会经过 webpack 打包&#xff0c;重新编译。 <a href"./p…

通过 a 标签下载文件

后台管理项目涉及到文件下载到本地&#xff0c;类型包括&#xff08;图片&#xff0c;音频&#xff0c;视频&#xff0c;office文件等等&#xff09;&#xff0c;只需将后台接口提供的url给到 a 标签即可。 <div class"preview-download" click.stop"downLoa…

a标签下载文档 a下载文档失败问题 跨域调用

可以通过a标签下载文档 a中有一个download属性 这个属性可以为空&#xff0c;如果写入的话这是写下载文档的名字 a标签默认下载是在同一个域内&#xff0c;如果跨域的话下载会失败&#xff0c;可能变成预览 出现的问题 from origin ‘http://localhost:8080’ has been blocke…

js使用a标签实现文件下载功能

工作中遇到下载txt文本文件的下载需求&#xff0c;稍作整理&#xff0c;下载示例如下&#xff1a; <button onclick"log()">文件下载</button>// 日志函数 function log() {// dom中创建a标签let aTag document.createElement(a)// 日志展示的内容let c…

JS-a标签下载文件

目录 问题描述解决方法拓展 另一种文件流下载 问题描述 昨天拿到一个需求,就是做成这种下载的模样 后台返回的下载链接长成这样 解决方法 就是一个最普通的方法,创建a标签 ,加上download属性,模拟标签点击 就可以触发下载了 注意:这个是因为直接拿到了请求链接,get请求 co…

HTML中的一些细节处理

# 说明 参考资料:简书的 伴歌知行的JS下载图片和文件&#xff0c;防止浏览器直接打开 、夜半修仙,;CSDN的weixin_3791475的使用a标签下载文件不跳转;努力学习的汪&#xff1a;洪学习笔记 文章目录 # 说明前端利用a标签实现文件[图片]下载文件下载常用方式总结分析Ⅰ-后端设置下…

JAVA中数组和集合的区别

转换 数组转换为集合&#xff1a; Arrays.asList(数组) 示例&#xff1a; 1 2 3 4 5 int[] arr {1,3,4,6,6};//定义一个长度为5数组 Arrays.asList(arr); for(int i0;i<arr.length;i){ System.out.println(arr[i]); } 集合转换为数组&#xff1a; 集合.toArray()…

JAVA中数组和集合的相互转换

数组转集合&#xff1a; 1.遍历&#xff0c;最常用的方法&#xff0c;但是过程会繁琐一点 int arrs[] {1, 2};//1.遍历List<Integer> list new ArrayList<>();for (int ele : arrs) {list.add(ele);}System.out.println(list);2.使用数组工具类的asList()方法 但…

数组与集合的区别及知识拓展

一、数组和集合的区别 1、数组的长度是固定的&#xff0c;一个数组只能存储一种类型的元素&#xff0c;可以存储任意类型。 2、集合的长度是可变的&#xff0c;存储引用数据类型&#xff0c;当存储基本数据类型时需要存储其对应的包装类。 二、知识拓展 1、基本数据类型所对应…

数组和集合的区别及定义方式

数组和集合的定义 一、数组 数组是java语言内置的数据类型&#xff0c;他是一个线性的序列&#xff0c;所有可以快速访问其他的元素&#xff0c;数组和其他语言不同&#xff0c;当你创建了一个数组时&#xff0c;他的容量是不变的&#xff0c;而且在生命周期也是不能改变的&a…

Java的数组与集合

Java的数组与集合 数组1.数组的概念2.数组的定义3.数组的初始化数组静态初始化数组动态初始化数组默认初始化值 4.数组元素访问5.数组的遍历6.数组的内存图JVM的内存图数组的内存图扩展 集合1.集合与数组的比较基本数据类型的包装类 2.集合中的成员方法 数组 1.数组的概念 数组…

数组与集合有什么不同之处

这个问题其实就是一个非常基础的面试题&#xff0c;一般面试官想了解你基础知识方面的掌握时&#xff0c;基本都会问这个问题&#xff0c;尤其是一些&#xff0c;计算机学子毕业之后&#xff0c;如果还是想要从事计算机技术相关的行业时&#xff0c;那么在面试的时候就需要做好…

kotlin数组和集合

一、Kotlin数组 1.对象数组 由Kotlin的main函数的写法&#xff0c;可以看出Kotlin中的对象数组写法与泛型的写法很像。 fun main(args: Array<String>){ } 声明对象数组的三种形式&#xff1a; (1)使用arrayOf函数和指定的数组元素创建数组 //Java写法: String[] p…

Java--数组和集合区别

一、数组 1、Java语言中的数组是一种引用数据类型&#xff1b;不属于基本数据类型 2、数组当中既可以存储“基本数据类型”的数据&#xff0c;也可以存储“引用数据类型”的数据&#xff08;数组既可以存储基本数据类型&#xff0c;又可以存储引用数据类型&#xff0c;基本数…

数组和集合的区别

一、数组声明了它容纳的元素的类型&#xff0c;而集合不声明。 二、数组是静态的&#xff0c;一个数组实例具有固定的大小&#xff0c;一旦创建了就无法改变容量了。而集合是可以动态扩展容量&#xff0c;可以根据需要动态改变大小&#xff0c;集合提供更多的成员方法&#xff…

数组和集合区别

一、数组声明了它容纳的元素的类型&#xff0c;而集合不声明。 二、数组是静态的&#xff0c;一个数组实例具有固定的大小&#xff0c;一旦创建了就无法改变容量了。而集合是可以动态扩展容量&#xff0c;可以根据需要动态改变大小&#xff0c;集合提供更多的成员方法&#xff…