前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mybatismysql批量insert数据_mysql数据库简介

mybatismysql批量insert数据_mysql数据库简介

作者头像
全栈程序员站长
发布2022-11-10 16:26:36
1.7K0
发布2022-11-10 16:26:36
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

文章目录


前言

MySQL批量插入操作相较于单次循环插入有较大的优势,在特定场景下,有比较重要的应用价值。


一、MySQL批量插入的应用场景

我在做项目的时候遇到Excel导入基础数据的情况,在对Excel进行解析,并拿到Excel里面的数据之后,下一步是插入数据库。最简单的方式是使用单次循环插入,但是这种方法效率太慢,不具有事务特征,所以使用批量插入的方法。

二、实现过程

1、Controller层获得导入的Excel数据

代码如下(代码中的CourseInfoList就是一个List集合,存储着CourseInfo对象):

代码语言:javascript
复制
    @PostMapping("/importCourse")
public AjaxResult importCourse(MultipartFile file) throws Exception{ 

GeneralListener<CourseInfo> generalListener = new GeneralListener<>();
EasyExcel.read(file.getInputStream(),CourseInfo.class,generalListener).sheet().doRead();
List<CourseInfo> courseInfoList = generalListener.getList();
courseService.insertCourseByBatch(courseInfoList);
return AjaxResult.success();
}

2、mapper.xml的SQL语句

service层和domain层就省略了。

  • mapper.java代码如下:
代码语言:javascript
复制
@Mapper
public interface CourseInfoMapper { 

void insertCourseByBatch(@Param("list") List<CourseInfo> list);
}
  • mapper.xml代码如下:
代码语言:javascript
复制
  <insert id="insertCourseByBatch" parameterType="java.util.List">
insert into course_info (id,courseNo,courseName, courseAttr, credit, totalHour, status, description)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{ 
item.id,jdbcType=BIGINT},#{ 
item.courseno,jdbcType=VARCHAR},#{ 
item.coursename,jdbcType=VARCHAR},#{ 
item.courseattr,jdbcType=VARCHAR},#{ 
item.credit,jdbcType=INTEGER},#{ 
item.totalhour,jdbcType=INTEGER},#{ 
item.status,jdbcType=INTEGER},#{ 
item.description,jdbcType=VARCHAR})
</foreach>
</insert>

这里遇到一个坑,网上很多博客在写这块的时候,都没有加上jdbcType,我一开始也没加,但是一直报错,后来加上jdbcType之后,才解决问题。

3、批量插入优点

  • 批量插入效率比单次插入要高很多,能节省大约2/3的时间,原因在于:(1)降低了日志(MySQL的binlog和innodb的事务日志)刷盘的数据量和频率。(2)减少了SQL语句的解析次数。(3)、减少了网络传输的IO等。
  • 操作的事务性。单次插入时,每个insert会开启一个事务,当执行很多insert的时候,会影响插入的性能。使用批量插入,可以在执行完成之后commit,保证了整批数据要么同时插入,要么都不插入。
  • 批量插入有数据量的限制,即max_allowed_packet值,超过最大值会报错,但是一般情况下不会超过最大值,如果需要插入几十万条甚至上百万条数据,就需要对这种情况进行处理。

总结

这里对mybatis批量插入进行一个小的总结,本质上是将很多条待插入的数据拼接为一条SQL语句,再执行插入操作,在Excel导入等场景下是很有用的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185660.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月5日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、MySQL批量插入的应用场景
  • 二、实现过程
    • 1、Controller层获得导入的Excel数据
      • 2、mapper.xml的SQL语句
        • 3、批量插入优点
        • 总结
        相关产品与服务
        云数据库 SQL Server
        腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档