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.pswp.cn/news/210477.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210477.shtml
英文地址,請注明出處:http://en.pswp.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;不會去過多地思考此外的事情。不知何為苦、何為樂&…