iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java分批将List数据导入数据库
  • 709
分享到

Java分批将List数据导入数据库

java数据库mysql 2023-08-19 18:08:07 709人浏览 独家记忆
摘要

目录 一、项目场景:二、为什么要分批次?三、解决方案:1. MyBatisPlus原生方法导入2. List分组导入(1)UserServiceImpl类中导入方法(2)UserMapper数据持久化接口(3)UserMapper.

一、项目场景:

在工作中的一个需求中,需要创建一张新的表,表格的初始数据需要从之前的多张表格中联查出来并且添加到当前表格中。由于在生产环境中数据量级达到了百万级别,因此在插入数据到Mysql中时需要分批次进行导入,我写了三种方法进行数据的导入,最后采用了第三种方法来进行数据导入,将实现过程在此进行记录。

在文章中,我将使用User来作为示例对象用于演示


二、为什么要分批次?

待更…


三、解决方案:

1. mybatisPlus原生方法导入

// 获取到要插入数据库集合,数据量很大List<User> list = new ArrayList<>();// 插入数据到mysqluserService.saveBatch(list);

2. List分组导入

(1)UserServiceImpl类中导入方法

@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Autowiredprivate UserMapper userMapper;@Overridepublic void insert() {    // 通过一系列操作获取到要插入的集合,在此使用list代替    List<User> list = new ArrayList<>();            // 每次插入的数量    int batchSize = 1000;    // 计算需要分多少批插入数据库    int batch = list.size() / batchSize;    // 计算最后一批的大小    int lastSize = list.size() % batchSize;    // 将筛选出的结果分批次添加到表中    for (int i = batchSize; i <= batch * batchSize; i = i + batchSize) {        // 截取本次要添加的数据        List<User> insertList = list.subList(i - batchSize, i);        // 添加本批次数据到数据库中        userMapper.batchInsert(insertList);    }    // 最后一批元素的大小是否为0    if (lastSize != 0) {        // 如果元素有剩余则将所有元素作为一个子列表一次性插入        List<User> lastList = list.subList(batchSize * batch, list.size());        // 添加集合到数据库中        userMapper.batchInsert(lastList);    }}}

代码解析:

先将列表分成每个1000个元素一批的子列表,然后使用自定义的 batchInsert() 方法对子列表进行批量插入操作。如果列表大小不是 1000 的倍数,则将剩余元素全部一次性插入。具体实现细节如下:

  1. 首先定义每一批次的插入数量 batchSize ,算出需要分几批插入变量 batch ,以及最后一批插入数量(集合中元素总量如果不是1000倍数时最后一批的剩余数量)的大小 lastSize 。
  2. 通过 for 循环,将列表分成每个 1000 个元素一批的子列表,随后使用 subList() 方法来获取当前批次要插入的元素
  3. 对于每一批要插入的子列表,使用自定义的 batchInsert() 方法进行批量插入操作。
  4. 判断最后一批的大小 lastSize 是否为 0,如果不为 0,则使用 subList() 方法将剩余所有元素作为一个子列表进行一次性插入。

在这里对最后一批插入元素时,下标为什么要使用 batchSize(每一批次的大小) * batch(批次数量) 来作为起始变量进行解析:

解析: 使用 batchSize * batch 作为集合的起始位置,是因为在 for 循环中已经将前 a 个元素作为起始位置插入到数据库中了,因此下一个起始位置应该是 batchSize 的倍数,即 batchSize * batch 。这样可以避免重复插入已经插入过的元素

(2)UserMapper数据持久化接口

将集合作为参数传递到Mapper层中

public interface UserMapper extends BaseMapper<User> {    Integer batchInsert(@Param("insertList") List<User> insertList);}

(3)UserMapper.xml映射文件

DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "Http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.zrkizzy.data.mapper.UserMapper"><insert id="batchInsert">        INSERT INTO tb_user (id, username, passWord)        VALUES        <foreach collection ="userList" item="user" separator =",">            (#{user.id}, #{user.username}, #{user.password})        foreach>    insert>mapper>

3. 多线程分批次插入

在第二种方法中,使用了分批次处理的数据导入方式,但是在数据量特别大的情况下,单线程的压力还是很大,因此使用多线程是比较好的一种方式。

(1)UserServiceImpl类中导入方法

@Servicepublic class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Autowiredprivate UserMapper userMapper;@Overridepublic void insert() {    // 通过一系列操作获取到要插入的集合,在此使用list代替    List<User> list = new ArrayList<>();                // 获取虚拟机可用的最大处理器数量        int availableProcessors = Runtime.getRuntime().availableProcessors();        // 获取要添加的数据集合大小        int total = list.size();        // 每次插入的数量        int batchSize = 1000;        // 计算需要分多少批插入数据库(向上取整)        int totalBatch = (total + batchSize - 1) / batchSize;        // 手动创建线程池        ExecutorService executor = new ThreadPoolExecutor(                // 线程池核心线程数量                availableProcessors,                // 线程池最大数量                availableProcessors + 1000,                // 空闲线程存活时间                1000,                // 时间单位                TimeUnit.MILLISECONDS,                // 线程池所使用的缓冲队列                new ArrayBlockingQueue<>(100),                // 线程池对拒绝任务的处理策略                new ThreadPoolExecutor.CallerRunsPolicy());        // 将筛选出的结果分批次添加到表中        for (int batchIndex = 0; batchIndex < totalBatch; batchIndex++) {            // 当前插入批次的起始索引            int startIndex = batchIndex * batchSize;            // 当前插入批次的结束索引            int endIndex = Math.min((batchIndex + 1) * batchSize, total);            // 截取本次要添加的数据            List<LuckyDrawHistory> insertList = list.subList(startIndex, endIndex);            // 将每个批次的插入逻辑封装成一个Runnable对象            Runnable task = () -> {                // 添加本批次数据到数据库中                userMapper.batchInsert(insertList);            };            // 提交添加任务            executor.submit(task);        }        // 关闭线程池释放资源        executor.shutdown();    }}

代码解析: 待更…


来源地址:https://blog.csdn.net/qq_48455576/article/details/130709629

--结束END--

本文标题: Java分批将List数据导入数据库

本文链接: https://www.lsjlt.com/news/375802.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java分批将List数据导入数据库
    目录 一、项目场景:二、为什么要分批次?三、解决方案:1. MyBatisPlus原生方法导入2. List分组导入(1)UserServiceImpl类中导入方法(2)UserMapper数据持久化接口(3)UserMapper....
    99+
    2023-08-19
    java 数据库 mysql
  • 如何将批量数据导入mysql数据库
    这篇文章将为大家详细讲解有关如何将批量数据导入mysql数据库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。如何将批量数据导入mysql数据库1.创建一个e...
    99+
    2024-04-02
  • 怎么实现java多线程批量拆分List导入数据库
    本篇内容介绍了“怎么实现java多线程批量拆分List导入数据库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!直接把list怼进Mysql使...
    99+
    2023-06-25
  • Java如何将Excel数据导入数据库
    这篇文章给大家分享的是有关Java如何将Excel数据导入数据库的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、根据业务需求设计数据库表2、根据数据库表设计一个Excel模板模板的每列属性必须与表字段一一对应3...
    99+
    2023-06-29
  • java多线程批量拆分List导入数据库的实现过程
    目录一、前言二、直接把list怼进Mysql三、分组把list导入Mysql中四、多线程分批导入Mysql五、小结一、前言 前两天做了一个导入的功能,导入开始的时候非常慢,导入2w...
    99+
    2024-04-02
  • Java将Excel数据导入到数据库的方法
    小编给大家分享一下Java将Excel数据导入到数据库的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!所用Jar包 sqljdbc4.jar连接数据库的Jar...
    99+
    2023-05-30
    java excel 数据库
  • Python将数据库数据导入到EXCEL
          每次给运营导数据的时候,如果不用工具的话,就是直接生成.csv格式的文件,这样的文件不支持'sheet',每次还有手工进行,相当的不科学,今天试试Python生成excel文件。        写的糙了点,但是这是一个很好的开始...
    99+
    2023-01-31
    导入到 数据库 数据
  • java批量导入Excel数据
    后台导入代码 import cn.afterturn.easypoi.excel.entity.ImportParams;import cn.afterturn.easypoi.excel.entity.result.ExcelImport...
    99+
    2023-09-01
    java excel vue.js
  • 利用Java怎么将excel表格批量导入到数据库
    本篇文章给大家分享的是有关利用Java怎么将excel表格批量导入到数据库,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。创建导入抽象类package com.gclo...
    99+
    2023-05-30
    java excel 数据库
  • 如何将数据表导入phpmyadmin数据库
    小编给大家分享一下如何将数据表导入phpmyadmin数据库,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!导入数据表:先选择数据...
    99+
    2024-04-02
  • 怎么将xml导入数据库
    将XML导入数据库可以分为以下几个步骤:1. 创建数据库表格:根据XML文件的结构,创建对应的数据库表格,表格的字段应与XML文件中...
    99+
    2023-10-11
    数据库
  • 如何将数据库导入navicat
    小编给大家分享一下如何将数据库导入navicat,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在开发时,数据库的设计与程序的设计是分开进行的。你在开发时经常会需要导入别的给你的数据库到你的...
    99+
    2024-04-02
  • 怎么在SQL Server数据库中批量导入数据
    今天就跟大家聊聊有关怎么在SQL Server数据库中批量导入数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、使用Select In...
    99+
    2024-04-02
  • 如何将RRD数据库中数据导入MYSQL中
    本篇文章为大家展示了如何将RRD数据库中数据导入MYSQL中,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。将RRD数据库中数据导入MYSQL中一、RRD数据库及RR...
    99+
    2024-04-02
  • django 批量导入数据
    一、需求我在数据库中建了一张表,用来保存ucloud云上的project id 和project namemodels.py代码如下#coding:utf-8 from django.db&nbs...
    99+
    2024-04-02
  • 怎么将json导入redis数据库
    将json导入redis数据库的示例:使用python3将json对象导入redis数据库。json对象var someexpert={id:10000realname: ‘expert-a’organization:’BUAA’}var ...
    99+
    2024-04-02
  • Java Excel数据导入数据库的方法
    目录1、根据业务需求设计数据库表2、根据数据库表设计一个Excel模板3、环境准备4、通过插件生成表对应的实体类5、自定义编写工具类6、编写具体业务逻辑Service7、在dao层对...
    99+
    2024-04-02
  • 如何用Python将数据批量的插入到数据库
    这篇文章给大家介绍如何用Python将数据批量的插入到数据库,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。我是一名挣扎在编程链底端的pythoner,工作中既要和数据打交道,也要保持和erp系统,web网站友好的&qu...
    99+
    2023-06-16
  • c#怎么调用SSIS Package将数据库数据导入
    本篇内容主要讲解“c#怎么调用SSIS Package将数据库数据导入”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c#怎么调用SSIS Package将数据库...
    99+
    2024-04-02
  • Java导出大批量数据(分批查询导出篇)
    上篇文章介绍了java导出文件格式篇xls,xlsx,csvhttps://blog.csdn.net/weixin_56567361/article/details/126640185 本篇介绍下 大批量数据的导出思路和方法 导出数据慢的...
    99+
    2023-09-10
    java 开发语言 sql mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作