Spring Boot 工厂模式 + 抽象类 + 泛型干掉重复代码

业务场景:N个Excel导入,实现动态加载,只需要定义Excel实体,即可实现功能开发,

核心代码

import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;public abstract class ScreenImportService<E, L, M extends BaseMapper<E>, S extends ServiceImpl<M, E>> implements InitializingBean {@Autowiredprivate S service;@Overridepublic void afterPropertiesSet() {String fileName = AnnotationUtil.getAnnotationValue(this.getExcelClass(), ExcelTarget.class, "value");ScreenImportFactory.register(fileName, this);}/*** 获取当前泛型-Excel*/public abstract Class<L> getExcelClass();/*** excel 转 entity 并补全参数*/public abstract List<E> excel2Entity(List<L> excelList);/*** 数据批量导入数据库*/public void dataImportDb(List<L> excelList) {// 全量导入service.remove(Wrappers.lambdaQuery());// excel 转 entity 并补全参数List<E> entityList = this.excel2Entity(excelList);if (CollectionUtil.isNotEmpty(entityList)) {service.saveBatch(entityList);}}}

工厂类

import cn.hutool.core.util.StrUtil;import java.util.HashMap;
import java.util.Map;/*** 大屏相关数据导入-工厂类** @author jason*/
public class ScreenImportFactory {private static final Map<String, ScreenImportService<?, ?, ?, ?>> strategyMap = new HashMap<>();public static ScreenImportService<?, ?, ?, ?> getInvokeStrategy(String name) {return strategyMap.get(name);}public static void register(String name, ScreenImportService<?, ?, ?, ?> service) {if (StrUtil.isBlank(name)) {return;}if (service == null) {return;}strategyMap.put(name, service);}public static Map<String, ScreenImportService<?, ?, ?, ?>> getStrategyMap() {return strategyMap;}}

实现类-每个文件有不同的实现

import cn.hutool.core.bean.BeanUtil;
import com.luoan.biz.hansi.domain.ScreenDataCountExcel;
import com.luoan.biz.hansi.entity.ScreenDataCount;
import com.luoan.biz.hansi.mapper.ScreenDataCountMapper;
import com.luoan.biz.hansi.service.ScreenImportService;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;/*** <p>* 大屏数据导入-汇总表 服务实现类* </p>** @author luoan* @since 2023-09-26*/
@Service
public class ImportCountServiceImpl extends ScreenImportService<ScreenDataCount, ScreenDataCountExcel, ScreenDataCountMapper, ScreenDataCountServiceImpl> {@Overridepublic Class<ScreenDataCountExcel> getExcelClass() {return ScreenDataCountExcel.class;}@Overridepublic List<ScreenDataCount> excel2Entity(List<ScreenDataCountExcel> excelList) {return Optional.ofNullable(excelList).orElse(new ArrayList<>()).stream().filter(Objects::nonNull).map(excel -> {ScreenDataCount entity = new ScreenDataCount();BeanUtil.copyProperties(excel, entity);// 参数补全entity.setCreateTime(LocalDateTime.now());entity.setCreateUserId(0);entity.setUpdateTime(LocalDateTime.now());entity.setUpdateUserId(0);return entity;}).collect(Collectors.toList());}}

统一调用,后续扩展很方便,N个导入,这块不用动了

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Assert;
import com.luoan.biz.hansi.service.ScreenImportFactory;
import com.luoan.biz.hansi.service.ScreenImportService;
import com.luoan.biz.hansi.utils.ExcelUtil;
import com.luoan.common.vo.Result;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.util.Arrays;
import java.util.Optional;/*** <p>* 大屏相关数据 前端控制器* </p>** @author luoan* @since 2023-08-09*/
@RestController
@RequestMapping("/admin/screen")
public class ScreenImportCommonController {@ApiOperation(value = "批量导入")@PostMapping("/batch_import")public Result<Object> batchImport(@RequestPart(value = "files") MultipartFile[] files) {Assert.notEmpty(files, "请检查上传的文件");Arrays.stream(Optional.ofNullable(files).orElse(new MultipartFile[]{})).forEach(file -> {String originalFilename = file.getOriginalFilename();String fileName = FileUtil.mainName(file.getOriginalFilename());ScreenImportService<?, ?, ?, ?> service = ScreenImportFactory.getInvokeStrategy(fileName);Assert.notNull(service, "请检查文件名:{}", originalFilename);service.dataImportDb(ExcelUtil.importExcel(file, service.getExcelClass()));});return Result.ok();}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/210477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

删除Windows系统中无用的隐藏设备

一些即插即用设备会占用一些隐藏的系统资源&#xff0c;比如USB转串口的设备会占用COM号码&#xff0c;网卡会占用静态IP地址等等。 通常我们使用设备管理器的显示隐藏设备功能&#xff0c;来删除这些设备。但是设备管理器每次只允许删除一个设备&#xff0c;如果设备太多了&a…

【算法集训】基础数据结构:四、栈

栈理解了两天&#xff0c;所以迟了一天发。 一、栈的概念 栈是一个容器&#xff0c;是一个先进后出的线性表&#xff0c;类似与日常生活中的电梯、杯子等。 仅限在表尾部进行插入和删除操作。 使用链表来模拟栈&#xff1a; typedef int DataType; 相当于给int起一个别名 st…

Go 协程基础:轻松入门并发编程,解析 Goroutines 的奥秘

一、协程基本使用 1、启动一个协程 主线程中每个100毫秒打印一次&#xff0c;总共打印2次另外开启一个协程&#xff0c;打印10次情况一&#xff1a;打印是交替&#xff0c;证明是并行的情况二&#xff1a;开启的协程打印2次&#xff0c;就退出了&#xff08;因为主线程退出了…

做题笔记:SQL Sever 方式做牛客SQL的题目--SQL157

----SQL157 平均播放进度大于60%的视频类别 计算各类视频的平均播放进度&#xff0c;将进度大于60%的类别输出。 注&#xff1a; 播放进度播放时长视频时长*100%&#xff0c;当播放时长大于视频时长时&#xff0c;播放进度均记为100%。 结果保留两位小数&#xff0c;并按播放进…

基于ssm的学生公寓管理中心系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生公寓管理中心系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

[报错]记录IDEA远程开发报错:java: Cannot run program.....

报错内容 IDEA在进行远程开发的时候报错&#xff0c;内容如下&#xff1a; java: Cannot run program "/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java" (in directory "/home/jim/.cache/JetBrains/RemoteDev-IU/_home_jim_DevCodes_Github_zfile/compile-…

redis主从复制【面试必看】

在分布式系统中&#xff0c;希望使用多个服务器来部署redis&#xff0c;存在以下几种redis的部署方式 主从模式主从哨兵集群模式 主从模式 在若干个redis节点中&#xff0c;有的是主节点&#xff0c;有的是从节点 假设有三个物理服务器&#xff08;称为是三个节点&#xff…

(JSP)EL——优化登录界面,获取对象,获取数据

EL优化登录界面 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <% String path request.getContextPath(); String basePath request.getScheme()"://"request.getServerName()":"reques…

生产工序(oj题)

很有趣的一道题 关键在于固定工序的整合 看样例是固定工序中间是不能插入其他工序的&#xff08;也不讲清楚&#xff09;&#xff0c;如果可以的话&#xff0c;只能说可能会更麻烦 注意固定工序是按照固定工序中的第一个工序进行排序的 整合完之后&#xff0c;就是递归列出…

Java中的IO流①——IO流的体系、字节流、try...catch异常处理

概述 IO流的分类 IO流的体系 这四个类都是抽象类&#xff0c;所以需要实现类对象才能使用---> 字节流 FileInputStream--> 书写细节 代码示范 此时文件a.txt内容为abcde 使用char强转和read方法调用五次read方法--> public static void main(String[] args) throws IO…

mysql 语言学习

整理了一下 mysql 操作语言&#xff0c;不是很全&#xff0c;部分地方也许需要修改&#xff0c;先放上来&#xff0c;有时间再慢慢完善。 一、数据库操作 连接数据库 $ sudo mysql [-h ip] -u root -p [-P 3306] 初始化数据库 $ mysql_secure_installation备份数据库 # 备…

初出茅庐的小李博客之TobudOS移植到EVB_AIoT开发板

本博客参考教程&#xff1a; https://atomgit.com/OpenAtomFoundation/TobudOS/blob/master/doc/TobudOS_EVB_AIoT_STM32_Guide.md 介绍一下EVB_AIoT开发板 这个开发板是由TobudOS开源社区联合意法半导体、南京厚德物联网设计的一款高性能IoT开发平台&#xff0c;主控芯片是S…

SystemVerilog学习(0)——目录与传送门

一、验证导论 SystemVerilog学习&#xff08;1&#xff09;——验证导论-CSDN博客文章浏览阅读403次。SystemVerilog自学&#xff0c;验证系统概述&#xff0c;什么是SVhttps://blog.csdn.net/apple_53311083/article/details/133953016 二、数据类型 SystemVerilog学习&…

含掩膜mask的单通道灰度图转化为COCO数据集格式标签的json文件(python)

输入&#xff1a;单通道的灰度图&#xff0c;灰度图内含掩膜mask 目标&#xff1a;把灰度图中的语义mask转换为COCO数据集格式的json文件 输出&#xff1a;COCO数据集格式的json文件 期间遇到的问题&#xff1a; 发现有的掩膜内部存在其他类别的掩膜&#xff0c;即mask内部还套…

枚举类简单使用

1、创建一个枚举 public enum DemoEnum {// 引号里面存放的是下面所创建的属性&#xff0c;如果不创建属性则不能输入引号里的值的NORMAL("正常"),DESTORY("废弃");private String label;private DemoEnum(String label){this.label label;}public Strin…

使用.net core MVC实现图片上传下载

今天闲来无事&#xff0c;复习复习 1、上传 上传界面 <div class"text-center"><h1 class"display-4">Welcome</h1><form method"post" enctype"multipart/form-data" asp-controller"Home" asp-ac…

<HarmonyOS主题课>三方库【课后考核】

【习题】三方库 判断题 三方组件是开发者在系统能力的基础上进行了一层具体功能的封装&#xff0c;对其能力进行拓展的工具 。 正确(True) 可以通过ohpm uninstall 指令下载指定的三方库 错误(False) lottie使用loadAnimation方法加载动画。 正确(True) 单选题 通过ohpm安…

@FunctionalInterface、Lambda表达式和方法引用

知识不回顾是会被遗忘的&#xff01; 网上看了一些相关文章&#xff0c;这里记录一下&#xff0c;仅供参考 Java语言从JDK1.8开始引入了函数式编程。 函数式编程的核心特点是&#xff0c;函数作为一段功能代码&#xff0c;可以像变量一样进行引用和传递&#xff0c;以便在有需…

stm32 使用18B20 测试温度

用18b20 测试温度是非常常用的&#xff0c;不过18B20的调试不是这么容易的&#xff0c;有些内容网上很多的&#xff0c;不再重复说了&#xff0c;我先把波形说一下&#xff0c;再说程序部分&#xff1a; 整个都温度数据的顺序是&#xff1a; 1.700uS的低电平复位并测试18B20的…

【素书学习】人生境界的四个层次

冯友兰先生认为人生境界有四个层次&#xff1a; 1、自然境界。总是依照社会习惯或本性而为&#xff0c;完全随天地运转而运转&#xff0c;无明了的目的&#xff0c;不明所做的意义。日出而作&#xff0c;日落而息&#xff0c;不会去过多地思考此外的事情。不知何为苦、何为乐&…