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 Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

HTML5 getUserMedia API网页录音实现指南示例小结

《HTML5getUserMediaAPI网页录音实现指南示例小结》本教程将指导你如何利用这一API,结合WebAudioAPI,实现网页录音功能,从获取音频流到处理和保存录音,整个过程将逐步... 目录1. html5 getUserMedia API简介1.1 API概念与历史1.2 功能与优势1.3