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

相关文章

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.