excel表数据多线程导入数据库

2023-11-14

Student table

一个学生表
在这里插入图片描述
excel表
在这里插入图片描述

Student实体

@Data
public class Student {
    private int id;
    private int studentId;
    private int teacherId;
    private String studentName;
    private int studentAge;
    private int studentSex;
}

StudentMapper

void studentAdd(int id,int studentId,int teacherId,String studentName,int studentAge,int studentSex);

 <insert id="studentAdd" >
        insert into student values(#{arg0},#{arg2},#{arg1},#{arg3},#{arg4},#{arg5})
</insert>

Service

public void saveExcelStudent(List<Student> studentList) throws InterruptedException {
        //一个线程处理100条数据
        int count = 100;
        //数据集合大小
        int listSize = studentList.size();
        //开启的线程数
        int threadSize = (listSize / count) +1;
        //存放每个线程的执行数据
        List<Student> newList = null;
        Integer mun = 0;
        ExecutorService executor = Executors.newFixedThreadPool(threadSize);
        CountDownLatch begin = new CountDownLatch(1);
        CountDownLatch end = new CountDownLatch(threadSize);
        //循环创建线程
        for(int i = 0;i < threadSize;i++){
            //startIndex是一个线程的第一个元素在studentList的索引,endIndex是一个线程最后一个元素在studentList的索引
            //newList 将一个线程在studentList对应的student放入newList
            if((i + 1) == threadSize){
                int startIndex = (i * count);
                int endIndex = studentList.size();
                newList = studentList.subList(startIndex,endIndex);
            }else{
                int startIndex = (i * count);
                int endIndex = (i + 1) * count;
                newList = studentList.subList(startIndex,endIndex);
            }
            //线程类
            ImportThread mythread = new ImportThread(newList,begin,end,studentMapper);
            executor.execute(mythread);
            mun = mythread.getCount();
        }
        while (count == mun){
            break;
        }
        begin.countDown();
        end.await();
        //执行完关闭线程池
        executor.shutdown();
    }

Controller

 @RequestMapping(value = "/import",method = RequestMethod.GET)
    public Integer importData() throws FileNotFoundException {

        //从excel读取数据
        long  start =  System.currentTimeMillis();
       // InputStream in = new FileInputStream("F:\\temp\\测试数据.xls");
        List<Student> studentList = ExcelToModelListUtil.getList("d:/student.xls");
        long  end  =  System.currentTimeMillis();


        try {
            studentService.saveExcelStudent(studentList);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("多线程异常");
        }
        long  end2  =  System.currentTimeMillis();
        System.out.println("读取Excel消耗时间:"+(end-start)+"毫秒");
        System.out.println("入库消耗时间:"+(end2-end)+"毫秒");
        System.out.println("消耗总时间:"+(end2-start)+"毫秒");

        return studentList.size();
    }

   

ExcelToModelListUtil

导入excel工具类,excel数据转studentList,传入excel文件路径,返回studentList

public class ExcelToModelListUtil {

    private ExcelToModelListUtil(){
    }
    public static List<Student> getList(String fileName) {
        //需要解析的Excel文件
        File file = new  File(fileName);
        List<Student> studentList = new ArrayList<>();
        try{
            //获取工作簿
            FileInputStream fs= FileUtils.openInputStream(file);
            HSSFWorkbook workbook=new HSSFWorkbook(fs);
            //获取第一个工作表
            HSSFSheet hs=workbook.getSheetAt(0);
            //获取Sheet的第一个行号和最后一个行号
            int last=hs.getLastRowNum();
            int first=hs.getFirstRowNum();
            //遍历获取单元格里的信息
            for (int i = first+1; i <= last; i++) {
                HSSFRow row=hs.getRow(i);
                int firstCellNum=row.getFirstCellNum();//获取所在行的第一个行号
                int lastCellNum=row.getLastCellNum();//获取所在行的最后一个行号
                Student student = new Student();

                student.setId(Integer.parseInt(String.valueOf(getValue(row,firstCellNum++))));
                student.setStudentId(Integer.parseInt(String.valueOf(getValue(row,firstCellNum++))));
                student.setTeacherId(Integer.parseInt(String.valueOf(getValue(row,firstCellNum++))));
                student.setStudentName((String) getValue(row,firstCellNum++));
                student.setStudentAge(Integer.parseInt(String.valueOf(getValue(row,firstCellNum++))));
                student.setStudentSex(Integer.parseInt(String.valueOf(getValue(row,firstCellNum++))));
                studentList.add(student);
            }
            System.out.println(studentList.toString());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return studentList;
    }

    private static Object  getValue(HSSFRow row,int j){
        HSSFCell cell=row.getCell(j);
        //设置单元格类型
        cell.setCellType(CellType.STRING);
        return cell.getStringCellValue();
    }
}


ImportThread

线程类

public class ImportThread implements Runnable {


    public ImportThread() {
    }

    StudentMapper studentMapper;
    private List<Student> list;
    private CountDownLatch begin;
    private CountDownLatch end;
    public Integer count = 0;


    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    /**
     * @param list    入库数据
     * @param begin   计时器
     * @param end     计时器
     * @param studentMapper 数据库连接
     */
    public ImportThread(List<Student> list, CountDownLatch begin, CountDownLatch end, StudentMapper studentMapper) {
        this.list = list;
        this.begin = begin;
        this.end = end;
        this.studentMapper = studentMapper;
    }

    @Override
    public void run() {
        try {
            for (Student student : list) {
                studentMapper.studentAdd(student.getId(),student.getStudentId(),student.getTeacherId(),student.getStudentName(),student.getStudentAge(),student.getStudentSex());
            }
            count = 1;
            begin.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            end.countDown();
        }
    }

}

测试

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

excel表数据多线程导入数据库 的相关文章

  • 数组 (UUID[ ]) 会破坏 1NF 吗?

    我的问题是包含 UUID 数组的字段是否会破坏范式 http en wikipedia org wiki Database normalization 在包含数组之前位于 NF 中的表中 原表 CREATE TABLE Floor Floo
  • 哪些 ORM 与 Scala 配合得很好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 关于ORA 21000

    我正在与 ORA 21000 作斗争 上面写着ORA 21000 raise application error 的错误号参数 3739 超出范围 此错误间歇性出现 我不知道为什么会发生这种情况 早些时候这工作得很好 但是从 Solaris
  • cdb - 大文件(数百 GB)的常量键值存储

    我需要一个类似于 cdb 常量数据库 的工具 它允许我在索引文件中存储大量数据 数百 GB 范围内 CDB 是理想的候选者 但它有 2 GB 的文件大小限制 因此不适合 我正在寻找的功能是支持二进制键和值的持久键值存储 创建后数据库是只读的
  • Hibernate 乐观锁..它是如何工作的?

    我正在阅读下面关于休眠乐观锁定的博客 我打算将它与休眠一起使用 但是 我有一个担忧 我们有java代码和c 代码 都连接到一个数据库 虽然java代码可以使用hibernate来实现乐观锁定 但我想让c 代码做同样的事情 此外 C 代码正在
  • 在cakephp 3中动态更改数据库连接

    我正在尝试更改中使用的数据库连接蛋糕php 3在飞行中 我找到的这个问题的每个答案都指的是蛋糕PHP 2 These https stackoverflow com questions 27655613 multiple databases
  • 如何调试 MySQL 存储过程?

    我当前的调试存储过程的过程非常简单 我创建一个名为 debug 的表 在存储过程运行时从其中插入变量值 这允许我查看脚本中给定点的任何变量的值 但是有没有更好的方法来调试 MySQL 存储过程 下列debug msg可以调用过程来简单地将调
  • 非关系数据库设计[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解您使用过的设计策略非关系型 nosql 数据库 也就是说 不使用传统关系设计或 SQL 的 大多数是新的 数据存储类 例如
  • 通过单击按钮将 Access 中的数据获取到 C# 中的文本框中

    我在 MS Access 中有一个表 其中包含 FoodID FoodName Price 在 C 中 我有三个文本框 txtId txtName txtPrice 和一个按钮 btnSearch 我的问题是 在 C 中 我只需在 txtI
  • 通过 JDBC 将“daterange”字段值插入 PostgreSQL 表

    我在 PostgreSQL 9 3 有一个表日期范围 http www postgresql org docs 9 3 static rangetypes html字段类型 我可以像使用 JDBC 的字符串一样选择此字段 但无法将其插入表中
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • java ResultSet,使用MAX sql函数

    你好 这就是我想要的 我连接到数据库并检索 UniqueId 列的最大元素 并将其分配给名为 maxID 的整数变量 这是我的方法 int maxID 0 Statement s2 con createStatement s2 execut
  • 如何在首次运行时填充大型 SQLite 数据库

    我正在开发一个基于 SQLite 数据库的字典应用程序 该数据库包含超过 300 000 行 问题在于 最终形式的数据库文件由全文索引表组成 并且重量远远超过150Mb 我通过创建无内容的 fts4 表设法将 db 文件大小降至最低 数据库
  • Android Realm.io:行/对象不再有效

    这是我的删除功能 它确实找到了workday1 object public static void delete Context context Workday workday Realm realm getRealm context re
  • 我应该用不可变或可变的数据结构来表示数据库数据吗?

    我目前正在使用 Scala 进行编程 但我想这适用于任何函数式编程语言 或者更确切地说 任何建议不变性并可以与数据库交互的编程语言 当我从数据库中获取数据时 我将其映射到模型数据结构 在函数式编程中 数据结构往往是不可变的 但是数据库中的数
  • 如何使用 django ORM 在外键字段上连接两个表?

    假设我有以下模型 class Position models Model name models CharField class PositionStats models Model position models ForeignKey P
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • 如何处理数据库中的巨大结果集

    我正在设计一个多层数据库驱动的 Web 应用程序 SQL 关系数据库 用于中间服务层的 Java 用于 UI 的 Web 语言其实并不重要 中间服务层执行数据库的实际查询 用户界面只是要求某些数据 并不知道它是由数据库支持的 问题是如何处理
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我

随机推荐

  • Java接口默认实现、接口和抽象类区别

    Java8新特性 Java8接口可添加默认实现 接口和抽象类的区别 设计模式 缺省适配模式 Java8接口可添加默认实现 java8新增了接口默认实现功能 每个接口可以有默认实现 实现类可以根据其需要进行定制化得实现 抽象方法前面添加def
  • 复旦邱锡鹏:深度剖析 ChatGPT 类大语言模型的关键技术

    内容来源 ChatGPT 及大模型专题研讨会 分享嘉宾 复旦大教授 邱锡鹏 分享主题 对话式大型语言模型 转载自CSDN稿件 ChapGPT 自问世以来 便展现出了令世人惊艳的对话能力 仅用两个月时间 ChatGPT 月活跃用户就达一亿 是
  • 网课教程(1) 前言

    什么是脚本 脚本 Script 是使用一种特定的描述性语言 依据一定的格式编写的可执行文件 脚本语言又被称为扩建的语言 或者动态语言 是一种编程语言 用来控制软件应用程序 脚本通常是以文本 ASC 保存 只是在被调用时进行解释或者编译 我们
  • CRM系统基本的模板示例

    CRM SSM总结 1 步骤 1 1 创建WEB项目 1 2 导入JAR lib下 包以及静态资源 css fonts js jsp 2 数据库 CREATE DATABASE crm ssm 客户来源 电话营销 网络营销 推广活动 促销活
  • 模式识别原理(Pattern Recognition)、概念、系统、特征选择和特征

    1 1 模式识别的基本概念 一 广义定义 1 模式 一个客观事物的描述 一个可用来仿效的完善的例子 2 模式识别 按哲学的定义是一个 外部信息到达感觉器官 并被转换成有意义的感觉经验 的过程 例 识别热水 字迹等 二 狭义的定义 1 模式
  • ML-数据分析模板

    文章目录 机器学习 数据分析模板 Objective Data Set Information Attribute Information INPUT 单特征与缺失值展示 Feature Cleaning Engineering 标签转换
  • Window10与Linux虚拟机实现文件传输

    前言介绍 对于许多需要使用Linux虚拟机的小伙伴来说 如何实现虚拟机和主机间的文件传输是一个问题 尤其是有些文件虚拟机下载不太方便 这时文件共享就比较重要了 当然 虚拟平台的软件提供商也有着一些解决方案 如VM下的Tools工具或者VB下
  • 5种Python雪花飘落代码(建议收藏)

    前言 本文章向大家介绍用 Python 实现雪花飘落效果 运行以下代码 你将会看到一个美丽的雪花效果 你可以根据自己的需求 调整代码中的参数值以及其他细节 第一种 普通雪花代码 import turtle import random def
  • sqrt函数

    sqrt 函数的用法 求三角形面积 今天刷题的时候看到了三角形面积 突然想到老师上课讲过 这不是好简单 就直接上代码 include
  • Faster R-CNN算法

    Faster R CNN算法是作者Ross Girshick对Fast R CNN算法的一种改进 Fast R CNN在速度和精度上都有了不错的结果 但仍有一些不足之处 Faster R CNN算法同样使用VGG 16网络结构 检测速度在G
  • 联想笔记本声音太小怎么办_电脑音量调到最大了还是声音太小,怎么办啊??...

    展开全部 准备一台电脑 计算机需e68a843231313335323631343130323136353331333433643633要安装驱动程序向导 或备份声卡驱动程序或驱动程序光盘 以下步骤是win7操作界面截图演示 1 首先 点击
  • java中的访问修饰符详解

    主要讲述一下java中protected的修饰控制范围 在叙述protected修饰符使用之前 先来说一下java 可以发现 开发java程序是一个时时刻刻都在编写类 开发类 定义类的过程 类里面可以有main方法 main方法不管存在那个
  • ppt太大怎么压缩变小呢?五种方法灵活运用

    为了更好地压缩PPT文件 还有一些制作PPT时的建议 使用压缩后的图片 在将图片插入到PPT中时 可以将其压缩后再插入 这样可以显著减小文件大小 废弃多余的幻灯片 将不需要的幻灯片删除或隐藏掉 这样可以减小PPT文件的大小 关闭自动保存 在
  • VC++中窗口过程函数及其消息发送、响应机制介绍

    在VC 中 窗口过程函数是应用程序定义的一个函数 主要功能是处理发送给窗口的消息 窗口过程函数的定义是 virtual LRESULT WindowProc UINT message WPARAM wParam LPARAM lParam
  • maven本地私服取jar包后再进行反编译获取源代码

    1 先去maven安装目录寻找setting xml D maven apache maven 3 1 1 conf 利用记事本打开 寻找标签 nexus central nexus mirror http XXX XXX XX XX 80
  • 【深度学习】CNN模型处理简单时间序列

    本文使用CNN模型 Conv1d卷积进行时间序列的分析处理 将数据导入模型后 可以运行 但模型预测精度不高 且输出十分不稳定 此模型仅用于熟悉CNN模型的基本结构 如有错误 还望海涵 目录 一 数据介绍 二 数据预处理 三 模型代码 四 模
  • 使用fastjson报错Exception in thread “main“ com.alibaba.fastjson.JSONException: syntax error, pos 1, line

    使用fastjson报错Exception in thread main com alibaba fastjson JSONException syntax error pos 1 line 1 column 2 问题背景 解决方案 总结
  • GDB调试技巧实战--为release程序加载符号

    问题 内存数据分析是开发人员的重要技能 特别是对于C C 程序员而言 微软表示 微软每年分配的CVE中有70 仍然是内存安全问题 内存数据就像事故现场 人们可以在其中发现内存数据重叠或损坏的内存数据 从而可能提供有价值的洞察力 揭示问题的根
  • AlexNet详解

    入门小菜鸟 希望像做笔记记录自己学的东西 也希望能帮助到同样入门的人 更希望大佬们帮忙纠错啦 侵权立删 完整代码在我的github上 有需要的朋友可以康康 GitHub tt s t Deep Learning Store some of
  • excel表数据多线程导入数据库

    Student table 一个学生表 excel表 Student实体 Data public class Student private int id private int studentId private int teacherI