java数据库批量插入数据的实现

 更新时间:2024年05月15日 08:29:22   作者:深夜无眠T  
本文主要介绍了java数据库批量插入数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

本篇文章将记录几种使用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;
    }

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

到此这篇关于java数据库批量插入数据的实现的文章就介绍到这了,更多相关java 批量插入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java(jdk)环境变量配置(XP、win7、win8)图文教程详解

    java(jdk)环境变量配置(XP、win7、win8)图文教程详解

    对于初学java的同学来说,第一件事不是写hello world,而是搭建好java开发环境,下载jdk,安装,配置环境变量。这些操作在xp、win7、win8不同的操作系统里面配置不太一样,下面通过本文给大家介绍如何在上面不同操作系统下配置
    2017-03-03
  • Spring Cloud Gateway Hystrix fallback获取异常信息的处理

    Spring Cloud Gateway Hystrix fallback获取异常信息的处理

    这篇文章主要介绍了Spring Cloud Gateway Hystrix fallback获取异常信息的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • mybatisPlus中apply的使用以进行联表等复杂sql语句详解

    mybatisPlus中apply的使用以进行联表等复杂sql语句详解

    在MyBatis-Plus中,`apply()`方法可以用于添加任意的SQL片段,包括联表查询,使用`apply()`方法的好处是可以直接添加原生的SQL片段,而不受MyBatis-Plus提供的常规查询条件构建方法的限制,但是,使用`apply()`方法需要注意安全性和性能问题
    2025-03-03
  • java 设计模式之适配器模式的详解

    java 设计模式之适配器模式的详解

    这篇文章主要介绍了java 设计模式之适配器模式的详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • Springboot项目Aop与拦截器与过滤器横向对比

    Springboot项目Aop与拦截器与过滤器横向对比

    前三篇文章已经介绍过Springboot项目如何实现Aop,拦截器和过滤齐功能,这篇文章主要介绍三者的横向对比,本文有一定的参考价值,感兴趣的小伙伴可以参考阅读
    2023-03-03
  • Java常用的八种排序算法及代码实现+图解

    Java常用的八种排序算法及代码实现+图解

    这篇文章主要介绍了Java常用的八种排序算法及代码实现,在Java的时候,对于排序的应用需要熟练的掌握,这样才能够确保Java学习时候能够有扎实的基础能力。那Java有哪些排序算法呢?本文小编就来详细说说Java经典的8种排序算法,需要的朋友可以参考一下
    2021-12-12
  • SpringBoot WebSocket连接报no mapping for GET问题

    SpringBoot WebSocket连接报no mapping for GE

    文章描述了一个在调试WebSocket连接时遇到的`nomappingforGET`异常问题,并提供了问题解决的方法,包括检查WebSocket注解和补充相关配置,此外,还特别提到了在使用Nginx转发WebSocket时所需的配置
    2025-02-02
  • 两种Eclipse部署动态web项目方法

    两种Eclipse部署动态web项目方法

    这篇文章主要介绍了两种Eclipse部署动态web项目方法,需要的朋友可以参考下
    2015-11-11
  • JAVA Future类的使用详解

    JAVA Future类的使用详解

    这篇文章主要介绍了JAVA Future类的使用详解,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • 使用Java生成32位16进制密钥的代码实现

    使用Java生成32位16进制密钥的代码实现

    在许多加密和安全应用中,生成随机的密钥是至关重要的一步,密钥通常以16进制形式表示,并且具有特定的长度,在这篇博客中,我们将探讨如何使用Java生成一个32位长度的16进制密钥,并展示详细的代码示例和运行结果,需要的朋友可以参考下
    2024-08-08

最新评论