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

mybatismysql批量insert数据_mysql数据库简介MySQL批量插入

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用


前言

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


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

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

二、实现过程

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

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

    @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代码如下:
@Mapper
public interface CourseInfoMapper { 
   
    void insertCourseByBatch(@Param("list") List<CourseInfo> list);
}
  • mapper.xml代码如下:
  <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.net/185660.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月5日 下午3:00
下一篇 2022年10月5日 下午3:00


相关推荐

  • Android静态代码检查-Lint

    Android静态代码检查-Lint参考文章 ImprovingYou 使用 lint 增强你的代码 AndroidLint 简介 gradlelintgr 中有 lint 任务 可以直接执行 lint 静态代码检查 但是前提是你的 build gradle 设置了 lintOptions 选项 android compileSdkVe

    2026年3月16日
    3
  • Azure 上通过 SendGrid 发送邮件

    Azure 上通过 SendGrid 发送邮件SendGrid 是架构在云端的电子邮件服务 它能提供基于事务的可靠的电子邮件传递 并且具有可扩充性和实时分析的能力 本文从 Azure 上创建 SendGrid 账号开始 介绍如何通过 SendGrid 发送邮件

    2026年3月16日
    2
  • 腾讯元宝ai头像功能使用教程

    腾讯元宝ai头像功能使用教程

    2026年3月13日
    3
  • Android调用系统原生分享组件[通俗易懂]

    Android调用系统原生分享组件[通俗易懂]想必做Android开发都会遇到的需求——分享。当然实现的需求和方式的也都各自不一,有接入某个app的SDK进行分享,也有集成第三方平台的例如友盟等等…接下来所要说到的是Android系统提供的分享组件。分享组件能够自动的检索到可以分享app然后将分享内容带入 当然这个也会有所限制的,会有个别app只能分享单一项:“文字+图片”、“图片”、“文字” 好处就是轻量级、避免导入其它jar包或依赖、可减少apk体积Filefile=newFile(filePath

    2022年6月19日
    31
  • OpenCV基本功 之 图像的掩模、运算 & 合并专题 -小啾带学【Python-Open_CV系列(七)】

    OpenCV基本功 之 图像的掩模、运算 & 合并专题 -小啾带学【Python-Open_CV系列(七)】OpenCV 图像的掩模 运算与合并 以 Python 为工具 Open CV 系列 七 1 图像的掩模 2 图像的运算 2 1 图像的加法运算 2 1 1 方法 2 1 2cv2 add 方法 2 1 3 使用掩模遮盖相加结果 2 2 图像的位运算 2 2 1 按位与 cv2 bitwise and 2 2 2 按位或 cv2 bitwise or 2 2 3 按位取反 cv2 bitwise not 2 2 4 按位异或 cv2 bitwise xor 图像加密 3 图像的合并加权合并覆盖

    2026年3月19日
    2
  • 我们来看看CAN转以太网的典型应用

    我们来看看CAN转以太网的典型应用LCNET 600E 622E 可以供用户对 CAN 网络和 IP 网络进行桥接 使不同 CAN 网络通过 IP 网络进行互连互通 也可以让应用软件和多个 CAN 网络通过 IP 网络互联互通 多个 CAN 网络通过 IP 网络互联互通 PC 上运行的应用软件和多个 CAN 网络通过 IP 网络互联互通

    2026年3月17日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号