关于使用easyExcel读取前端文件和MybatisPlus批量插入

news2024/10/6 16:37:31

关于使用easyExceld读取前端文件和MybatisPlus批量插入

文章目录

  • 关于使用easyExceld读取前端文件和MybatisPlus批量插入
    • 实体类
    • 监听器
    • 开始调用
    • 可能出现的问题
    • 最后,关于MybatisPlus的批量插入
      • 写一个工具类
      • 写一个配置类
      • 到Mappe中添加这个方法

最近写项目,后端需要用到easyExcel来获取前端上传的表格,分析表格数据并存储到数据库

项目暂时是:springBoot + MybatisPlus

easyExcel官方文档地址:读Excel | Easy Excel (alibaba.com)

因为项目中我暂时只用到读Excel,所以文档的地址就给大家放到上面啦,有其他需要的话可以自查

实体类

第一步,你需要一个实体类,这个实体类对应数据库中的一个表

然后使用@ExcelProperty注解将excel表的列名对应的属性绑定起来

比如:我的Excel表是这样的:
在这里插入图片描述

那么绑定到实体类就应该是这样的:

@Data
public class Classroom implements Serializable {
    //自增
    private int classroomId;
    @ExcelProperty("教室号")
    private String classroomName;
    //管理员的buildingId
    private int buildingId;
    @ExcelProperty("摄像头设备id")
    private String cameraId;
    @ExcelProperty("esp8266id")
    private String espId;
    @ExcelProperty("可通电的最少人数")
    private int numLimitOn;
    @ExcelProperty("教室分流人数阈值")
    private int numPeakFlow;
    @ExcelProperty("可通电的最低温度")
    private float temperatureLimitOn;
    @ExcelProperty("断电最高温度阈值")
    private float temperatureLimitOff;
    @ExcelProperty("教室容量")
    private int classroomCapacity;
    @ExcelProperty("是否特殊供电")
    private int specialOn;
}

监听器

第二步,按照官方文档,还需要一个监听器

//官方文档中又有比较详细的注释,我的代码因为要实现自己的需求,所以和官方文档可能不太一样
//这里我就挑一些可能比较重要的部分写上注释
@Data
@Component   //加上Component注解的同时记得到启动类上使用@MapperScan加上这个类的包路径,不然扫描不到会报空指针异常
public class ClassroomListener extends AnalysisEventListener<Classroom> {
	
    private static final int BATCH_COUNT = 10000;
    private static List<Classroom> cachedDataList = new ArrayList<>();
    private int buildingId;
    
    @Resource
    private ClassroomMapper classroomMapper;

    //这是一个回调函数,就是每读取一条数据都会来执行这个方法
    @Override
    public void invoke(Classroom classroom, AnalysisContext analysisContext) {

        classroom.setBuildingId(buildingId);
        //每次读取excel表中的一条数据,都存放到list中
        cachedDataList.add(classroom);
        //直到超过10000条,就进行持久化操作,然后清空ilst集合,继续读取
        if(cachedDataList.size() >= BATCH_COUNT){
            saveData();
            cachedDataList.clear();
        }
    }

    //这个函数是只有在读取完所有数据之后,才会调用(只执行一次)
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        saveData();
        cachedDataList.clear();
    }

    //这里是持久化操作,因为不想多次调用insert,所以我选择批量插入
    //insertBatchSomeColumn:这个批量插入还需要做其他的配置,放在后面将
    private void saveData() {
        //批量插入
        classroomMapper.insertBatchSomeColumn(cachedDataList);
    }
}

开始调用

到这一步就可以开始通过这个监听器来读写excel了

//注入listener
@Resource
ClassroomListener classroomListener;

pubilc void test(){
    //是的,在你的业务层调用easyExcel读写excel的时候只需要这一行代码就够了
    //你可以配合上你自己的代码逻辑去使用
     EasyExcel.read(multipartFile.getInputStream(), Classroom.class, classroomListener)
         	  .sheet().doRead();
}

可能出现的问题

如果有仔细看easyExcel官方文档中的代码的同学可能就会,发现,我的代码和官方的其实还是有细微的差别

区别就在于,我通过@Compotent注解手动的将Listener作为一个普通组件交给Spring,从而做到可以在Listener中注入Mapper

而官方文档中的是没有将他交给Spring的,而且在测试的时候,官方代码如下:

 EasyExcel.read(multipartFile.getInputStream(), Classroom.class, new ClassroomListener()).sheet().doRead();

仔细看,可以发现官方文档在业务层的代码中的Listen是直接通过new新建出来的

而我的是则是直接在业务层注入Listen这个Bean(上面有提到我给Listener加了@Component注解,已经把他交给Spring了)

因为事实上,监听器,过滤器,以及拦截器都是不归Spring管的

所以如果你不将监听器手动交给Spring的,直接在监听器中使用@Resource注解的话,就会报空指针异常,因为这个时候注入是无效的

感兴趣的可以上网搜一下:”监听器中@Resource注解和@Autowire注解失效“

当然,解决这个问题也不止可以用注解,也可以自己写工具类,提供一些其他的方法去拿到Bean

最后,关于MybatisPlus的批量插入

MybatisPlus其实也有提供一个批量插入的方法,但是那个方式本质上也是多次的调用insert()

关于insertBatchSomeColumn(List list)这个方法,大家可以直接复制下面的代码就可以了

写一个工具类

package com.airweb.util;
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import java.util.List;

public class InsertBatchSqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        methodList.add(new InsertBatchSomeColumn());
        return methodList;
    }
}

写一个配置类

package com.airweb.config;
import com.airweb.util.InsertBatchSqlInjector;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class MybatisPlusConfig {

    @Bean
    public InsertBatchSqlInjector easySqlInjector () {
        return new InsertBatchSqlInjector();
    }
}

到Mappe中添加这个方法

package com.airweb.mapper;
import com.airweb.model.entity.Building;
import com.airweb.model.entity.Classroom;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;

@Mapper
public interface ClassroomMapper extends BaseMapper<Classroom> {

    /**
     * 批量插入
     * @param classrooms
     */
    void insertBatchSomeColumn(@Param("list") List<Classroom> classrooms);
}

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

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

相关文章

SUSE 宣布开发与 RHEL 兼容的 Linux 发行版

导读近日消息&#xff0c;SUSE 在今天宣布&#xff0c;它将 fork 公开可用的 Red Hat Enterprise Linux (RHEL)&#xff0c;并将开发和维护与 RHEL 兼容的发行版&#xff0c;所有人都可以不受限制地使用该发行版本。未来几年&#xff0c;SUSE 计划向该项目投资超过 1000 万美元…

分布式训练数据并行极致优化:ZeRO

分布式训练数据并行极致优化&#xff1a;ZeRO 导言 随着 ChatGPT 的爆火&#xff0c;大模型成为了近些年人工智能的研究热点。大模型能力惊艳&#xff0c;但是训练起来成本也不小。大模型&#xff0c;顾名思义&#xff0c;最大的特点就是 “大”。这里的 “大” 通常指的就是…

本地部署 Stable Diffusion XL 1.0 Gradio Demo WebUI

StableDiffusion XL 1.0 Gradio Demo WebUI 0. 先展示几张 StableDiffusion XL 生成的图片1. 什么是 Stable Diffusion XL Gradio Demo WebUI2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 Stable Diffusion XL Gradio Demo WebUI6. 启动 Stable Diffusion XL Gradi…

c语言内存函数的深度解析

本章对 memcpy&#xff0c;memmove&#xff0c;memcmp 三个函数进行详解和模拟实现&#xff1b; 本章重点&#xff1a;3个常见内存函数的使用方法及注意事项并学会模拟实现&#xff1b; 如果您觉得文章不错&#xff0c;期待你的一键三连哦&#xff0c;你的鼓励是我创作的动力…

基于深度学习的裂纹图像分类研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2023最新ChatGPT商业运营版网站源码+支持ChatGPT4.0+GPT联网+支持ai绘画(Midjourney)+支持Mind思维导图生成

本系统使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到本系统&#xff01; 支持GPT3模型、GPT4模型Midjourney专业绘画&#xff08;全自定义调参&#xff09;、Midjourney以图生图、Dall-E2绘画Mind思维导图生成应用工作台&#xff08;Prompt&#xff09;AI绘画广场自定…

行业动态 - Zhaga 常见问题解答

本文采用chatGPT 3.5翻译润色&#xff0c;内容来自于Zhaga联盟官网Zhaga FAQ [1]&#xff0c;原文网页提供了更多的延伸阅读资料&#xff0c;可点击文末链接访问。另外不得不说&#xff0c;chatGPT对文字的优化调整功能太好用了。 ​ 1. "Zhaga"这个名字的由来和含义…

Nuxt 菜鸟入门学习笔记二:配置

文章目录 Nuxt 配置环境覆盖环境变量和私有令牌 应用配置runtimeConfig 与 app.config外部配置文件Vue 配置支持配置 Vite配置 webpack启用试验性 Vue 功能 Nuxt 官网地址&#xff1a; https://nuxt.com/ 默认情况下&#xff0c;Nuxt 的配置涵盖了大多数用例。nuxt.config.ts …

【雕爷学编程】Arduino动手做(172)---WeMos D1开发板模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

为什么 Raft 原生系统是流数据的未来

虽然Apache Kafka正在逐步引入KRaft以简化其一致性方法&#xff0c;但基于Raft构建的系统对于未来的超大规模工作负载显示出更多的潜力。 ​共识是一致性分布式系统的基础。为了在不可避免的崩溃事件中保证系统的可用性&#xff0c;系统需要一种方式来确保集群中的每个节点保持…

快速跑 nerf instant-ngp 快速调试与配置,跑自己的数据

1.下载Anaconda3 2.打开Anaconda Prompt (Anaconda) 创建虚拟环境 conda create -n nerf-ngp python3.8切换到虚拟环境 conda activate nerf-ngp安装相关依赖包 pip install commentjson imageio numpy opencv-python-headless pybind11 pyquaternion scipy tqdm安装完毕后…

现在设计师都在用哪些工具做UI设计

随着国内企业在用户交互方面的竞争&#xff0c;UI设计的未来是无限的。 如果你仍然或只是在寻找一个合适的UI设计工具&#xff0c;那么这篇文章应该非常适合你。 1.即时设计 即时设计是一款免费的在线 UI 设计工具&#xff0c;无系统限制&#xff0c;浏览器打开即可使用&…

Java面试准备篇:全面了解面试流程与常见问题

文章目录 1.1 Java面试概述1.2 面试流程和注意事项1.3 自我介绍及项目介绍1.4 常见面试问题 在现代职场中&#xff0c;面试是求职过程中至关重要的一环&#xff0c;特别是对于Java开发者而言。为了帮助广大Java开发者更好地应对面试&#xff0c;本文将提供一份全面的Java面试准…

Python中安装pyinstaller并打包为exe可执行程序

环境&#xff1a;vs2022 win10 python3.7.8 工具&#xff1a;pyinstaller 1、安装pyinstaller&#xff0c;cmd --> pip install pyinstaller 2、安装完成后&#xff0c;打开cmd&#xff0c;输入命令&#xff1a;pyinstaller -F xxx.py &#xff0c;xxx为py文件的全路径&am…

超细整理,Python接口自动化测试-关联参数(购物接口实例)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么是参数关联&a…

Hadoop生态体系-2

目录标题 1、MapReduce介绍2、数据仓库3、HIVE4、HQL4.1 hive读写文件机制4.2 Hive数据存储路径 1、MapReduce介绍 思想&#xff1a;分而治之 map:“分”&#xff0c;即把复杂的任务分解为若干个“简单的任务”来处理。可以进行拆分的前提是这些小任务可以并行计算&#xff0c…

3D 渲染技巧-如何创建高质量写实渲染?

掌握创建高质量建筑渲染和任何 3D 渲染的艺术是一项复杂且需要技巧的工作&#xff0c;通常需要多年的经验和实践。实现逼真的结果需要仔细考虑众多因素&#xff0c;并避免可能导致缺乏真实性的假渲染效果的常见错误。 避免常见错误 - 提升渲染游戏的技巧 在追求创建真正逼真的…

数据中心机房机柜配电新模式的探讨与选型

安科瑞 华楠 摘 要&#xff1a;对数据中心机房列头柜配电方式特征和问题进行深入研究&#xff0c;分析机房末端配电安全性及可用性&#xff0c;主要阐述了数据中心机房机柜配电新模式。 关键词&#xff1a;数据中心&#xff1b;机房机柜&#xff1b;配电模式 1 原始配电方案 …

Pycharm中如何设置在新窗口打开项目

settingAppearance&Behavior–System SettingsOpen project in - new window

抑郁症的自我治疗:警惕隐藏在微笑背后的抑郁症

抑郁症是一种常见的心理疾病&#xff0c;它可以隐藏在微笑背后。许多人经常感到沮丧、情绪低落&#xff0c;这时候可能是抑郁症的前兆。然而&#xff0c;自我治疗也是一种非常有效的抑郁症治疗方法。在本文中&#xff0c;我将分享一些关于如何自我治疗抑郁症的方法。 首先&…