java—数据库批量插入数据

news2024/12/26 21:00:36

前言

本篇文章将记录几种使用java向mysql数据库中批量插入数据的方法,比如插入1000条,10000条,10万条甚至100万条数据。操作数据库的方式采用Mybatis框架。

输入的数据:

现数据库有一个student表,表中字段如下:

编写student实体类,及其controller和dao层,因为只是插入数据所以不需要加service层。

方法一

最简单的方法就是利用循环,不断执行单条数据的插入指令。

因此在dao中写一个insertStudent方法,并在xml文件中编写sql语句

void insertStudent(Student student);
    <insert id="insertStudent" parameterType="com.example.bootdemo.entity.Student">
        insert into student (s_name,s_birth,s_sex) values (#{s_name},#{s_birth},#{s_sex})
    </insert>

随后在controller中编写循环条用该方法,比如循环插入1000条数据,代码如下:

    @ResponseBody
    @RequestMapping("/insertstudent")
    public Integer insertStudent(){
        System.out.println("开始插入");
        long start = System.currentTimeMillis();
        /**
         * 依靠循环插入
         */
        for (int i = 0; i < 1000; i++) {
                Student student = new Student();
                student.setS_birth("20230206");
                student.setS_name("zjd");
                student.setS_sex("男");
                studentDao.insertStudent(student);
        }

        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-start));
        return 1;
    }

这种方式虽然可以实现,但是效率比较慢,因为每次执行插入都要执行一次sql,速度很慢。


方法二

在所有要插入的数据放在列表中,并在sql中利用foreach进行批量插入。这样执行一次sql就可以插入很多数据。

xml编写中编写sql

    <insert id="batchInsertStudent" parameterType="java.util.List">
        insert into student (s_name,s_birth,s_sex) values
        <foreach collection="students"  item="student" index="index" separator=",">
            (
             #{student.s_name},
             #{student.s_birth},
             #{student.s_sex}
            )
        </foreach>
    </insert>

将数据方法List中执行sql语句。

    @ResponseBody
    @RequestMapping("/insertstudent")
    public Integer insertStudent(){
        System.out.println("开始插入");
        long start = System.currentTimeMillis();
        /**
         * 批量插入,大量数据时不推荐使用
         */
        List<Student> students = new ArrayList<>(count);
        for(int i=0;i<count;i++){
            Student student = new Student();
            student.setS_name("zjd"+i);
            student.setS_birth("20230206");
            student.setS_name("zjd");
            student.setS_sex("男");
            students.add(student);
        }
        studentDao.batchInsertStudent(students);

        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-start));
        return 1;
    }

这两种方法在数据量很大时都不推荐使用,第一种会很慢,第二种可能会因为数据过多,sql执行失败,直接报错。

方法三

既然第二种在插入大量数据时会报错,那么面对大量数据,我们可以将其分批插入,比如我可以每次直插入3000条数据,执行多次就可以实现大量数据的插入。

代码如下:

    @ResponseBody
    @RequestMapping("/insertstudent")
    public Integer insertStudent() throws InterruptedException {
        System.out.println("开始插入");
        long start = System.currentTimeMillis();
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for(int i=0;i<6;i++){
            List<Student> students = new ArrayList<>(count);
            int tempCount = 0;
            for(int n=0;n<count;n++){
                if(tempCount==2999){
                    studentDao.batchInsertStudent(students);
                    tempCount=0;
                    students.clear();
                }
                Student student = new Student();
                student.setS_name("zjd"+i);
                student.setS_birth("20230206");
                student.setS_name("zjd");
                student.setS_sex("男");
                students.add(student);
                tempCount++;
            }
            studentDao.batchInsertStudent(students);
            long end = System.currentTimeMillis();
            System.out.println("耗时:"+(end-start));
            countDownLatch.countDown();
        }
        countDownLatch.await();
        return 1;
    }

这样速度也会比单条循环插入要快很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1676552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手撸XXL-JOB(二)——定时任务管理

在上一节中&#xff0c;我们介绍了SpringBoot中关于定时任务的执行方式&#xff0c;以及ScheduledExecutorService接口提供的定时任务执行方法。假设我们现在要写类似XXL-JOB这样的任务调度平台&#xff0c;那么&#xff0c;对于任务的管理&#xff0c;是尤为重要的。接下来我们…

讲解SSM的xml文件

概述&#xff1a;这些配置文件很烦&#xff0c;建议直接复制粘贴 springMVC.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XM…

k8s endpoint

Endpoint Service 并不是和 pod 直接相连的&#xff0c;Endpoint 介于两者之间。Endpoint 资源就是暴露一个服务的 IP 地址和端口的列表。 虽然在 spec 服务中定义了 pod 选择器&#xff0c;但在重定向传入连接时不会直接使用它。选择器用于构建 IP 和端口列表&#xff0c;然…

SQOOP详细讲解

SQOOP安装及使用 SQOOP安装及使用SQOOP安装1、上传并解压2、修改文件夹名字3、修改配置文件4、修改环境变量5、添加MySQL连接驱动6、测试准备MySQL数据登录MySQL数据库创建student数据库切换数据库并导入数据另外一种导入数据的方式使用Navicat运行SQL文件导出MySQL数据库impo…

企业必看:镭速教你如何测试内网文件传输效率和稳定问题

在现代商业运作中&#xff0c;企业内部文件传输的效率和稳定性对于数据管理和业务流程极为重要。无论是远程工作还是团队协作&#xff0c;高效的文件传输都能显著提升工作效率。今天镭速小编就教你如何测试内网文件传输效率和稳定问题。 1、磁盘性能&#xff0c;即硬盘的读取和…

JVM从1%到99%【精选】-运行时数据区

目录 1.总览运行时数据区 2.内存溢出 3. 程序计数器 4.虚拟机栈 5.本地方法栈 6.堆 7.方法区 8.直接内存 1.总览运行时数据区 Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。运行时数据区可以分为方法区、堆、虚拟机栈、本地方法栈、程序计数器…

分享一些关于软件测试的面试问题

由于最近在面试软件测试工程师的岗位&#xff0c;遇到了一些面试的问题以及我的答案&#xff0c;希望对正在找工作的同行有些帮助&#xff0c;仅仅作为软件测试行业&#xff0c;求职者看问题就行&#xff0c;大佬可以探讨一下答案。 1.提交了bug&#xff0c;开发不认为是bug怎么…

JavaScript的综合案例

案例要求&#xff1a; 实现一个表单验证 1.当输入框失去焦点时&#xff0c;验证输入的内容是否符合要求 2.当点击注册按钮时&#xff0c;判断所有输入框的内容是否都符合要求&#xff0c;如果不符合要求阻止表单提交 简单的页面实现 <!DOCTYPE html> <html lang&…

凸优化理论学习三|凸优化问题(一)

系列文章目录 凸优化理论学习一|最优化及凸集的基本概念 凸优化理论学习二|凸函数及其相关概念 文章目录 系列文章目录一、优化问题&#xff08;一&#xff09;标准形式的优化问题&#xff08;二&#xff09;可行点和最优点&#xff08;三&#xff09;局部最优点&#xff08;四…

【万字面试题】Redis

文章目录 常见面试题布隆过滤器原理和数据结构&#xff1a;特点和应用场景&#xff1a;缺点和注意事项&#xff1a;在python中使用布隆过滤器 三种数据删除策略LRU (Least Recently Used)工作原理&#xff1a;应用场景&#xff1a; LFU (Least Frequently Used)工作原理&#x…

振弦式应变计的灵敏系数k范围探讨

振弦式应变计是一种广泛应用于工程结构健康监测的重要设备&#xff0c;其灵敏系数k是衡量其性能的关键指标。本文将探讨振弦式应变计的灵敏系数k的一般范围&#xff0c;并分析影响灵敏系数的因素。 一、振弦式应变计的工作原理 振弦式应变计通过测量振弦在受力作用下的振动频率…

屡被约谈的货拉拉三闯IPO,CEO周胜馥IPO前套现11亿

近日&#xff0c;货运巨头货拉拉第三次闯关IPO。虽然其实现首次年度盈利&#xff0c;但光鲜数据背后的盈利模式却频遭诟病。 货拉拉的创始人周胜馥从美国高校毕业后&#xff0c;曾供职于贝恩咨询公司&#xff0c;并在期间对创业产生了浓厚兴趣。抛开履历中的高学历好工作的部分…

Amesim基础篇-表格类型设置与读取

前言 在Amesim仿真中,不可避免需要应用到表格。如新能源动力电池中内阻、充电倍率的调取,压缩机的机械效率、容积效率等,水泵的效率,管路的压降等等。本文将介绍如何对表格类型的选择与参数输入。 1 进入表格设置界面 如下图所示,在Amesim界面的右上角Table Editor进入…

EEL中 python端的函数名是如何传递给js端的

python端的函数名是如何传递给js端的 核心步骤&#xff1a;将函数名列表注入到动态生成的 eel.js 中&#xff0c;这样前端一开始引用的eel.js本身已经包含有py_function的函数名列表了。你打开开发者工具看看浏览器中的 eel.js文件源代码就知道了。 具体实现&#xff1a; # 读…

使用 Flask Blueprint 实现模块化 Web 应用

文章目录 1. 什么是 Flask Blueprint&#xff1f;2. 为什么要使用 Flask Blueprint&#xff1f;3. 如何使用 Flask Blueprint&#xff1f;4. 在 Blueprint 之间进行通信5. 结合 Flask 插件系统进行功能拓展结语 当构建大型 Flask Web 应用时&#xff0c;保持代码的组织结构清晰…

etcd单机部署和集群部署

1、etcd单实例部署 对于平常的学习&#xff0c;其实搭建一个单机节点是够了的。接下来就讲讲怎么搭建单机节点。 本次部署是在 centos7 系统&#xff0c;cpu 为amd64 上面进行的。 部署是直接使用官方编译好的二进制文件&#xff0c;大家也可以直接看 ectd-releases 界面选择…

linux 环境下 分布式文件搭建fastDFS

1.软件信息 地址&#xff1a;happyfish100 (YuQing) GitHub 1.fastdfs-master.zip 2.fastdfs-nginx-module-master.zip 3.libfastcommon-master.zip 4.libserverframe-master.zip yum install make cmake gcc gcc-c perl 2.安装libfastcommon unzip libfastcommon-mast…

CPU利用率使用教程

本文主要参考&#xff1a; 一文让你学到 nmon最详尽的用法 Linux性能监控命令_nmon 安装与使用 如果你是在Ubuntu上安装nmon&#xff0c;使用&#xff1a; apt install nmon安装好后&#xff0c;直接运行 $:nmon #运行如果是后台抓数据&#xff1a; -f 参数: 生成文件,文件…

北京玻色量子携手赛氪网举办长三角高校数学建模竞赛巡回讲座

2024年5月13日下午&#xff0c;一场聚焦数学建模与量子计算前沿的讲座在中国计量大学隆重举行。此次讲座作为第四届长三角高校数学建模竞赛的巡回宣讲活动之一&#xff0c;由北京玻色量子科技有限公司与竞赛组委会成员赛氪网共同举办&#xff0c;旨在向广大师生介绍量子计算的应…

企业如何利用美国多IP服务器来提升网站的安全性?

企业如何利用美国多IP服务器来提升网站的安全性? 在当前网络环境下&#xff0c;网站安全性日益成为企业面临的重要挑战。为了有效应对各种潜在威胁&#xff0c;越来越多的企业选择利用美国多IP服务器来提升其网站的安全性。这种服务器配置能够通过一系列策略来增加网站的安全…