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

相关文章

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Redis分片集群的实现

《Redis分片集群的实现》Redis分片集群是一种将Redis数据库分散到多个节点上的方式,以提供更高的性能和可伸缩性,本文主要介绍了Redis分片集群的实现,具有一定的参考价值,感兴趣的可以了解一... 目录1. Redis Cluster的核心概念哈希槽(Hash Slots)主从复制与故障转移2.

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.