Java实现Excel文件中多张有关联的表导入数据库

2023-10-27 21:10

本文主要是介绍Java实现Excel文件中多张有关联的表导入数据库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java实现Excel文件中多张有关联的表导入数据库

一、功能展示

(1)Excel文件主表(AerosolItemsExcelDTO)
在这里插入图片描述
对应的数据库表(AerosolItems)
在这里插入图片描述


重点说明:此处‘气溶胶条目标识’对应数据库‘id’。这个标识用于将同一Excel文件中不同的表关联起来,并不写入数据库,数据库的id采用自增的。


(2)和主表相关联的表( AerosolDegraStruExcelDTO)
在这里插入图片描述
对应的数据库表(AerosolDegraStructure)
在这里插入图片描述


重点说明:‘气溶胶条目标识’ 即和主表的‘气溶胶条目标识’相对应,用于做关联并不存入数据库。 ‘itemid’是将主表的信息写入数据库后在数据库的id,这样通过‘itemid’就可以找到其关联的主表信息


最后效果

在这里插入图片描述
主表某条记录导入后自增产生一个id
在这里插入图片描述
与主表关联的表自增产生id,关联的主表id在itemId中

二、工具

1.使用了阿里巴巴的开源工具Easy Excel,官网链接

		<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel-core</artifactId><version>3.1.1</version></dependency>

2.对数据库的读写操作使用了Mybatis-plus框架

三、步骤与代码

  1. 创建Excel表的实体类ExcelDTO和数据库的实体类Entity。(因为数据库字段和Excel表字段不完全对应,所以分开创建两个不同的实体类)
    //主表ExcelDTO

//@ExcelProperty(index = 0) 设置Excel字段序号和Excel文件对应

@Data
@ToString
@EqualsAndHashCode
public class AerosolItemsExcelDTO {/*** 编号(假)*/@ExcelProperty(index = 0)private String fakeId;/*** 气溶胶三级类别*/@ExcelProperty(index = 1)private String category;/*** 气溶胶成分*/@ExcelProperty(index = 2)private String componentString;/*** 标签*/@ExcelProperty(index = 3)private String label;/*** 浓度*/@ExcelProperty(index = 4)private String concen;............
}

//关联表ExcelDTO

@Data
@ToString
@EqualsAndHashCode
public class AerosolDegraStruExcelDTO {/*** 编号(假)*/@ExcelProperty(index = 0)private String aerosolFaketId;/*** 菌群名称*/@ExcelProperty(index = 1)private String name;/*** 浓度%*/@ExcelProperty(index = 2)private String concen;/*** 百分比*/@ExcelProperty(index = 3)private String percentage;/*** 优势种*/@ExcelProperty(index = 4)private String advantage;
}

//主表数据库的实体类Entity

@Data
@TableName("aerosol_items")
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "气溶胶条目")
public class AerosolItems extends Model<AerosolItems> {private static final long serialVersionUID = 1L;/*** 编号*/@TableId@ApiModelProperty(value="编号")private Integer id;/*** 气溶胶三级类别*/@ApiModelProperty(value="气溶胶三级类别")private Integer l3cate;/*** 气溶胶成分*/@ApiModelProperty(value="气溶胶成分")private Integer component;/*** 浓度*/@ApiModelProperty(value="浓度")private String concen;/*** 气溶胶结构*/@ApiModelProperty(value="气溶胶结构")private String structure;/*** 采样标签*/@ApiModelProperty(value="采样标签")private String label;/*** 链接显示名*/@ApiModelProperty(value="链接显示名")private String refText;
........

//关联表数据库Entity

@Data
@TableName("aerosol__degra_structure")
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "")
public class AerosolDegraStructure extends Model<AerosolDegraStructure> {private static final long serialVersionUID = 1L;/*** 编号*/@TableId@ApiModelProperty(value="编号")private Integer id;/*** 气溶胶编号*/@ApiModelProperty(value="气溶胶编号")private Integer itemid;/*** 菌群名称*/@ApiModelProperty(value="菌群名称")private String name;/*** 浓度*/@ApiModelProperty(value="浓度")private String concen;/*** 百分比*/@ApiModelProperty(value="百分比")private String percentage;/*** 优势种*/@ApiModelProperty(value="优势种")private String advantage;
}
  1. 将Excel文件中各个表的内容分别读取到各自的Excel表实体类中,最后用List存放多条记录

//excelFile对应excel文件,head(ExcelDto),sheet(Excel文件中表的顺序),headRowNumber(Excel表的第几行开始读数据)

List<AerosolItemsExcelDTO> aerosolItemsExcelList;
List<AerosolDegraStruExcelDTO> aerosolDegraStruExcelList;try {aerosolItemsExcelList = EasyExcel.read(excelFile).head(AerosolItemsExcelDTO.class).sheet(0).headRowNumber(1).doReadSync();aerosolDegraStruExcelList = EasyExcel.read(excelFile).head(AerosolDegraStruExcelDTO.class).sheet(1).headRowNumber(1).doReadSync();} catch (Exception e) {throw new CheckedException("文件解析错误,请重新下载模板!");}
  1. 创建Map,主表Map结构为Map<String,ExcelDTO>,关联表Map结构为<String,List<ExcelDTO>>(因为主表的某一行数据,可能关联表有几行关联的数据,所以关联表用List。String为Excel文件中的关联标识)

//将List——>Map

Map<String, AerosolItemsExcelDTO> aerosolItemsMap;
Map<String, List<AerosolDegraStruExcelDTO>> aerosolDegraStruMap;try {aerosolItemsMap = aerosolItemsExcelList.stream().collect(Collectors.toMap(AerosolItemsExcelDTO::getFakeId, Function.identity()));} catch (Exception e) {throw new CheckedException("气溶胶条目标识不唯一,请重新修改!");}aerosolDegraStruMap = aerosolDegraStruExcelList.stream().collect(Collectors.groupingBy(AerosolDegraStruExcelDTO::getAerosolFaketId)); 
  1. 遍历主表Map,将ExcelDTO转换为Entity,存入数据库,存入数据库后得到其在数据id,然后根据fakeId找到和主表某一行记录关联的关联表记录。
for (Map.Entry<String, AerosolItemsExcelDTO> entry : aerosolItemsMap.entrySet()) {//拿到Excel文件中的条目标识,用于找其关联的信息String fakeId = entry.getKey();AerosolItemsExcelDTO aerosolItemsExcelDTO = entry.getValue();//创建数据库EntityAerosolItems aerosolItems = new AerosolItems();//数据拷贝BeanUtil.copyProperties(aerosolItemsExcelDTO, aerosolItems);...//使用mybatis-plus 保存数据到数据库aerosolItemsService.save(aerosolItems);//返回在数据库的id,传入到第五步中Integer id = aerosolItems.getId();List<AerosolDegraStruExcelDTO> aerosolDegraStruDTOList = null;//根据Map的键(fakeId)找关联的记录if (ObjectUtils.isEmpty(aerosolDegraStruMap.get(fakeId))) {aerosolDegraStruDTOList = new ArrayList<>();} else {//找到了aerosolDegraStruDTOList = aerosolDegraStruMap.get(fakeId);}
  1. 遍历找到的记录存入数据库
				aerosolDegraStruDTOList.forEach(aerosolDegraStruExcelDTO -> {AerosolDegraStructure aerosolDegraStructure = new AerosolDegraStructure();BeanUtil.copyProperties(aerosolDegraStruExcelDTO, aerosolDegraStructure);//第4步中的idaerosolDegraStructure.setItemid(id);aerosolDegraStructureList.add(aerosolDegraStructure);aerosolDegraStructureService.saveBatch(aerosolDegraStructureList);});

这篇关于Java实现Excel文件中多张有关联的表导入数据库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/288410

相关文章

Spring Security常见问题及解决方案

《SpringSecurity常见问题及解决方案》SpringSecurity是Spring生态的安全框架,提供认证、授权及攻击防护,支持JWT、OAuth2集成,适用于保护Spring应用,需配置... 目录Spring Security 简介Spring Security 核心概念1. ​Securit

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter