29.从零开始学springboot-批量“覆盖导入”&“更新导入”

数据库覆盖式数据导入方法介绍 覆盖式数据导入是指将新的数据完全替换目标数据库中的现有数据。与增量导入不同,覆盖式导入不会保留原有数据,而是直接用新的数据进行覆盖。这种方法适用于需要全量更新数据的场景,例如定期从外部数据源同步数据或进行数据备份恢复。在后端开发中,数据导入是一个常见的任务。当我们需要将大量的数据从一个数据源导入到数据库中时,覆盖式导入是一种高效的方法。本文将介绍覆盖式数据导入的概念、实现方法以及相应的源代码示例。通过以上的覆盖式数据导入方法,你可以方便地将新的数据批量导入到数据库中,实现全量更新的需求。 阅读详情

前言

作者之前做了个excel导入导出的功能。之前的实现思路是完全的"覆盖导入"。什么意思?意思就是,每次导入excel时按照一定的过滤条件,
把之前存储的数据的状态置为删除状态(在真实的环境中开发,几乎不存在"物理删除",也就是真正的把数据删除的应用场景,基本上都是用一个"状态"字段来控制)。
然后,本次导入的数据就无需关心之前的那些数据,只需按照"新增"插入记录即可。

这种实现方式有好处也有坏处。
好处:
屏蔽了很多的"细节",所有的数据可以批量插入,简单高效率。

坏处:
屏蔽的"细节"会引起很多关联性的逻辑问题。
打个比方,比如你excel导入了一批数据,执行了批量入库操作,之后mysql会自动为每条记录生成一个唯一的主键ID,此后,你用这个唯一的ID去关联了一些业务上的东西。
此时,如果你采用"覆盖导入"的方式再次导入一摸一样的excel,就会出现什么问题呢?是的,之前数据库的那批记录全部是"删除"状态了,相同的一条记录生成了另一个主键ID,这时,
业务系统就会找不到之前关联的那条记录。

所以,针对业务强关联的系统,有必要思考一种真正的"更新导入"的方式。

思考

为了解决"覆盖导入"引发的业务逻辑问题,我们需要理解"更新导入"所需要实现的几个点。

我们假设这样的业务场景:用户对同一张excel连续导入了多次,此时,正确的实现中,我们数据库中应该永远只有一份完整的导入数据。

而应对多次导入维护的这一份完整的数据,我们需要解决以下几个问题:

  • 同一份excel,用户没有修改任何记录,总记录条数不变

  • 同一份excel,用户修改了某条记录的某值,总记录条数不变

  • 同一份excel,用户新增多条记录,总记录条数增加

  • 同一份excel,用户删除了多条记录,总记录条数减少

  • 同一份excel,用户删除了多条记录,并新增了多条记录,总记录条数对应变化

以上大致描述了这些场景,大家肯定发现了,针对这些场景,我们几乎只能通过用户导入excel时,我们与库中存储的每一条记录进行比对来确定对应的操作。
是的,作者也是这样想的。所以基于"比对"的核心实现思想,我们就需要对excel的格式有一定要求,至少需要excel中有一列的值是唯一的,打个比方,execl中
每条记录都有一个编码值,这个值在现实业务里是唯一的。

基于此,我们来整理一下实现思路:

  • 导入的excel中,某条记录的编码值和数据库的某条是一致的,此时执行update操作
  • 导入的excel中,某条记录的编码值在数据库中不存在,此时执行insert操作
  • 导入的excel中,某条记录的编码值在数据库中存在,但是excel中不存在,此时执行delete操作(其实是update操作,将其置为"删除")

好的,虽然我们称这种实现方式为"更新导入",但是可以看出,此"更新"包含了新增,更新,删除(更新)操作.

我们理清了"更新导入"的实现,此时,有同学肯定有问题了,如果excel中没有这个所谓的业务编码唯一值,那么应该如何做"更新导入"呢?

作者,只能说事情很糟糕了,为什么?那意味着你只能对每条记录的每个字段进行比对,来确认该记录是更新还是删除还是新增,这无疑对性能是个打击。要是excel的字段很多,无疑很是致命。

实现

每次上传时,读取excel的记录数,同时读取数据库中已有的记录数,取两个集合的交集,差集

假设A集合为excel读取的记录,B集合读取的为数据库已有的数据

  • A和B的交集,即A和B都有的数据,就是需要更新的数据
  • A和B的差集,即A比B多出的数据,就是需要新增的数据
  • B和A的差集,即B比A多出的数据,就是需要删除的数据

为此,我们写两个函数,用来提取交集和差集。假设每一条记录的实体类为Entity,唯一的编码属性为code。

/**
 * 获取两个ArrayList的交集
 */
private List<Entity> sameList(List<Entity> oldArrayList, List<Entity> newArrayList) {
    List<Entity> resultList = oldArrayList.stream()
            .filter(item -> newArrayList.stream().map(e -> e.getCode())
                    .collect(Collectors.toList()).contains(item.getCode()))
            .collect(Collectors.toList());
    return resultList;
}

/**
 * 获取两个ArrayList的差集
 */
private List<Entity> diffList(List<Entity> firstArrayList, List<Entity> secondArrayList) {
    List<Entity> resultList = firstArrayList.stream()
            .filter(item -> !secondArrayList.stream().map(e -> e.getCode())
                    .collect(Collectors.toList()).contains(item.getCode()))
            .collect(Collectors.toList());
    return resultList;
}

总结

这边就不贴其它的代码了,关键的两个函数已经给出,思路也理清了~希望能帮到需要的同学。

请关注我的订阅号

订阅号.png

置顶必读(1) |《滚雪球学 Spring Boot 4.x》专栏目录导航篇(持续更新中)! 🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。 阅读详情

相关推荐

SpringBoot接入JaCoCo实践

SpringBoot接入JaCoCo实践

qq_16422103的博客 2779

[Spring boot] Spring boot 实现Excel批量导入数据并将文件保存到本地

[Spring boot] Spring boot 实现Excel批量导入数据

weixin_57169969的博客 7365

CKA 1.29 实操训练:RBAC、NetworkPolicy 与 Ingress 的考试级闭环解法

Kubernetes 权限控制(RBAC)、网络策略(NetworkPolicy)和服务暴露(Ingress)是 CKA 认证的核心能力模块。其原理基于声明式资源绑定、标签选择器匹配与 API 版本约束,技术价值在于实现最小权限原则、零信任网络隔离与服务可访问性保障。典型应用场景包括 CI/CD 权限收敛、多租户流量管控及生产环境服务发布。本文聚焦 CKA 1.29 考试真实环境下的实操闭环——从 candidate 账号上下文约束出发,详解 ClusterRole 创建、namespaceSelector

weixin_34293911的博客 982

SpringBoot关于List集合的校验

SpringBoot集合List的校验

囚徒之困 3894

基于Springboot+Vue的人事管理系统毕设源码解析与实战

前后端分离架构是现代Web开发的核心模式,Springboot与Vue分别承担后端服务与前端交互,通过RESTful API完成数据通信。人事管理系统作为典型企业级业务场景,涵盖RBAC权限、员工信息、考勤薪资、文件管理等模块,是理解Springboot自动装配、MyBatis分页、JWT认证等技术原理的理想载体。本文从架构分层与接口约定出发,分析系统设计的技术价值,并结合实际部署流程,深入讲解环境配置、数据库初始化、跨域代理、Token失效处理等工程实践中的高频问题与避坑方案。进一步探讨如何通过操作日志、

weixin_33933118的博客 351

数据中心GPU芯片性能参数速查表(Nvidia+国产算力卡)

本文提供了一份数据中心GPU芯片性能参数速查表,涵盖Nvidia与国产算力卡两大阵营。文章详细解读了算力、显存、互连技术及功耗等关键性能指标,并对比了A100、H100、昇腾910B等主流型号,旨在帮助用户根据AI训练、推理等实际场景,做出高效的硬件选型与成本评估决策。

a0b1c2d3的专栏 834

Spring Boot 内置工具类 CollectionUtils

Spring Boot 内置工具类 CollectionUtils

qq_41525524的博客 1136

MuJoCo柔性体仿真实战:从FlexComp建模到自定义模型导入

柔性体仿真是机器人交互研究中不可或缺的一环,MuJoCo作为高精度物理求解器,凭借高效的求解速度与批量并行能力,成为强化学习与软体抓取任务的热门选择。其FlexComp机制将连续材料离散为粒子-约束系统,以较低建模成本模拟布料、软组织等形变行为,相比Gazebo等平台更具实时性与可扩展性。技术价值体现在自定义柔性体建模与导入流程中:通过XML配置网格密度、间距与材料参数,即可生成贴合任务需求的软体垫子或硅胶抓手。在柔性抓取、颗粒抓手、医疗仿真等场景中,该方法能快速构建可训练的环境。围绕环境搭建、FlexCo

weixin_29045585的博客 156

Springboot-文件上传

Springboot-文件上传

爱笑的boy的博客 402

麒麟信安3.3-6C电网版虚拟机安装避坑指南:从ISO下载到SSH配置全流程

本文提供麒麟信安3.3-6C电网版虚拟机的详细安装与配置指南。针对电力行业仿真测试需求,重点解析从ISO镜像获取、虚拟机环境准备、安装过程中的三大“雷区”(如多管理员密码逻辑、分区方案、网络配置)到首次启动后的网络、SSH及root策略配置的全流程避坑要点,帮助技术人员高效、安全地完成部署。

rainy的博客 853

告别手动!用Python+CATIA V5/V6自动生成三视图和标题栏(附完整代码)

本文详细介绍了如何利用Python和CATIA V5/V6实现工程图自动生成,包括三视图布局和标题栏填写。通过COM接口调用和智能算法,系统能自适应不同尺寸模型,大幅提升设计效率。附完整代码和部署方案,帮助团队实现从手动到自动化的转变。

weixin_42699679的博客 351

Springboot save()局部更新,@DynamicUpdate生效的条件

首先,用getById()查出原值,然后赋值想要修改的新的字段值(copy克隆赋值)

K10I 822

zynq 7010/020 AMP双核通信-Vitis2023/2024

在platform cpu1设置中添加;注意value中使用空格分开程序思路:比较简单。

weixin_43310175的博客 916

【课程设计】springboot“医相伴”智慧小程序 计算机毕业设计源码14831

前端患者用户模块: (1)注册登录:用户可以通过登录功能快速进入小程序,若未注册则可以选择马上注册。对于忘记密码的用户,提供了便捷的密码找回途径。此外,小程序支持微信登录,用户可以选择暂不授权或确认授权,以便快速使用服务。对于已有账号的用户,提供了立即登录的选项,方便他们快速进入个人中心。 (2)首页:小程序的首页设计了轮播图,展示医院的最新动态和重要通知。用户可以查看不同科室的信息,了解医生的专业背景,获取医院的最新资讯,以及阅读网站公告,确保患者能够及时获取医院的重要信息. (3)科室信息:用户可以搜索

Biye_Design的博客 1万+

金蝶云星空API实战:从零到一,用Postman打通业务数据流

本文详细介绍了如何使用Postman调试金蝶云星空API,从创建第三方应用到实战调试技巧,帮助开发者快速打通业务数据流。文章重点讲解了API配置的关键细节、常见问题排查方法以及自动化测试方案,提升开发效率与准确性。

weixin_33712987的博客 516

18、探索隐私工程技术的前沿:从理论到实践

本文深入探讨了隐私工程技术的核心概念、关键技术及其应用场景,分析了加密技术、访问控制和用户界面设计等在隐私保护中的作用,并结合数据库保护、物联网设备等实际场景进行阐述。同时,文章还讨论了隐私工程技术面临的挑战与未来发展趋势,提出了数据最小化原则、差分隐私、隐私增强技术等优化策略以及隐私设计、隐私影响评估等最佳实践,最后展望了新兴技术对隐私保护的影响及法规推动下的发展方向。

weixin_35307279的博客 372

通过java springboot实现阿里云dns动态解析

目录 1.创建一个springboot项目: 2.添加依赖 3.添加代码 4.创建定时任务 5.获取token 6.修改配置 如果你有公网ip,或者可以通过ipv4地址访问设备,那到这一步就可以跳转到打包步骤了,需要解析ipv6的请继续往下看 7.修改代码获取ipv6地址 8.打包 9.添加手动更新(非必需) 10.最后 首先简单回顾一下整体思路:在服务器部署一个基于springboot的jar包,长期运行该jar包,在里面设置一个定时任务,定时执行函数实现dns解析的...

YZero_cn的博客 3136

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 2049

java-springboot基于的四季来酒店管理系统的设计与实现 基于 SpringBoot 的“四季来”智慧酒店服务平台研发 融合 SpringBoot 与 MySQL 的四季来酒店计算机毕业设计

本文介绍了一个基于Java-SpringBoot的四季来酒店管理系统设计与实现。该系统针对酒店行业痛点,采用B/S架构和MySQL数据库,实现了客房管理、预订入住、费用结算等全流程数字化。系统包含三大角色:管理员(负责系统配置和权限管理)、员工(处理日常业务操作)和用户(自助查询预订)。通过可视化界面和智能算法,有效解决了传统酒店管理中存在的房态冲突、账务错误等问题,提升运营效率30%以上。开发环境采用IDEA/Eclipse+MySQL5.7/8.0+JDK1.8等技术栈,具有操作简便、响应快速等特点,适

毕设程序分享_清学姐 1774

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

计算机毕业设计springboot医疗管理系统 基于SpringBoot的互联网医院信息管理平台 融合SpringBoot的智慧医疗服务系统

摘要:本文介绍了一个基于SpringBoot框架的医疗管理系统毕业设计方案,该系统采用MVC分层架构与MySQL数据库,实现&quot;互联网+医疗&quot;全流程管理。系统包含三大角色功能模块:管理员(用户/医生/科室管理)、医生(预约/医嘱处理)、患者(在线挂号/医嘱查询),覆盖从挂号排班到诊断随访的完整业务流程。设计采用标准开发流程,包含详细的数据库E-R图、系统用例图和操作流程图,提供用户认证、权限控制及数据安全机制。系统旨在提升医院管理效率,改善患者就医体验,为后续医疗大数据分析奠定基础。(14

毕设源码_严学姐 1309

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spring Boot 2.4.0 重磅发布,学不动了!!

Spring Boot 2.4.0最近发布了,很多小伙伴表示学不动了!!没关系,今天送大家一份硬核教程:Spring Boot 学习笔记,包括底层实现原理及代码实战,非常齐全,助你快速...

纯洁的微笑 761

idea没有springboot_SpringBoot简介以及学习大纲

学习中心第11阶段Spring全家桶(Spring Boot)全套技术点课程,总计80课时,视频、源码、资料、笔记,一个都不少,你想要的,没想到的,通通都给你了!SpringBoot是一个框架,一种全新的编程规范,他的产生简化了框架的使用,所谓简化是指简化了Spring众多框架中所需的大量且繁琐的配置文件,所以SpringBoot是一个服务于框架的框架,服务范围是简化配置文件。所以从本质上来说,S...

weixin_39650994的博客 119

SpringBoot 2 系列停止维护,Java8 党何去何从?

点击关注公众号,Java干货及时送达????SpringBoot 2.x 版本正式停止更新维护,官方将不再提供对 JDK8 版本的支持SpringBoot Logo版本的新特性目前最新SpringBoot版本为3.2 版本,其亮点包括:支持 JDK17、JDK21 版本对虚拟线程的完整支持JVM Checkpoint Restore(Project CRaC)的初步支持SSL 证书热加载更新应用可观察性...

方志朋的博客 641

springboot集成nacos

springboot集成nacos步骤 1.引入pom依赖 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery 2.启动类上加@EnableDiscoveryClient注解 注:springboot现在已经允许不加这个注解也能注册了 3.增加配置 spring: cloud: nacos: discovery: service: msb-stock server-addr: localhost:8848 注:bootstrap.

u013800720的博客 543

Day499&500&501&502&503&504,BAT大厂最爱问的Java核心面试百题详细解析

选择先更新数据,再删除缓存,再设置之前再删除一次缓存,然后再设置缓存的策略方案注册中心挂了,本地持久化注册中心信息服务挂了,通过配置监控系统来实现对应监控千千万万要记得:多刷题!!多刷题!!之前算法是我的硬伤,后面硬啃了好长一段时间才补回来,算法才是程序员的灵魂!!!!篇幅有限,以下只能截图分享部分的资源!!(1)多线程(这里以多线程为代表,其实整理了一本JAVA核心架构笔记集)(2)刷的算法题(还有左神的算法笔记)(3)面经+真题解析+对应的相关笔记(很全面)(4)视频学习(部分)

2401_84435166的博客 986

基于SpringBoot封装通用返回结果类

为了规范返回结果,保证返回结果风格统一,提高编码效率与前端调试效率,封装通用返回结果类、通用分页结果类。本文还提供了简单的使用示例和源代码。

程序员雅痞的博客 2853
上一篇: 28.从零开始学springboot-详解金钱类BigDecimal
下一篇: JavaBean-一个“豆子”的故事
码哥说
博客等级 码龄8年 5645粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值