【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口

news2024/11/25 12:36:47

文章目录

  • 【MySQL × SpringBoot 小点子】全面实现流程 · 数据库导出Excel表格文件的接口
    • 1. 什么是VO(View Object)对象
    • 2. BeanCopyUtils进行两个对象的数据转移
    • 3. mapper层实现
    • 4. service层实现
    • 5. vo对象创建
    • 6. 保存路径配置
    • 7. controller层核心代码实现
    • 8. wagger接口
    • 9. 补充

img

【MySQL × SpringBoot 小点子】全面实现流程 · 数据库导出Excel表格文件的接口

在上一篇博客,【MySQL × SpringBoot 突发奇想】全面实现流程 · xlsx文件,Excel表格导入数据库的接口_s:103的博客-CSDN博客

我们学习了如何导入表格,现在我们反过来,看看如何导出表格~

1. 什么是VO(View Object)对象

网络资料:

View Object(视图对象)是一种在软件开发中常见的设计模式,它用于在用户界面(UI)层与业务逻辑层(业务模型)之间进行数据交互。其主要目的是在UI层提供一个面向用户的数据模型,将业务模型中的数据进行适配、处理和展示,从而实现UI与业务逻辑的解耦。

View Object具有以下特点和作用:

  1. 封装数据:View Object通过封装业务模型中的数据,将其进行适配和转换,以适应UI层的需求。它可以包含计算属性、格式化数据、过滤数据等操作,使得UI层能够更直接地访问和展示数据。

  2. 提供友好的数据接口:View Object通常会为UI层提供简单和易于使用的数据接口,使得UI层可以轻松地获取和修改其中的数据。它往往会提供诸如getters、setters、事件通知等方法,以便UI层对其数据进行操作和监听。

  3. 简化UI开发:通过使用View Object,UI开发人员可以专注于UI设计和交互逻辑的实现,而无需过多关注业务逻辑的处理和数据处理等细节。同时,View Object还可以提供数据验证、状态管理等功能,简化UI开发过程。

  4. 实现UI与业务逻辑的解耦:View Object作为UI层与业务逻辑层之间的中间层,可以实现两者的解耦。它可以根据UI层的需求对业务模型进行适配,使得业务模型的变化对UI层来说是透明的,从而提高系统的灵活性和可维护性。

需要注意的是,View Object并不是所有项目中必须存在的概念,它在一些复杂的UI交互、数据处理较为复杂的场景下更常见,并且在不同的技术栈和框架中实现方式也会有所差异。

我觉得最重要的一点就是,满足前端需求的一组数据

在前后端交互过程中,一般有三种情况:

  1. 后端的一个实体类需要删减一些数据,不发给前端
  2. 后端的一个实体类需要多加一些数据,发给前端
  3. 后端的一个实体类全部信息都发给前端

第三种不必多说,正常写代码;

第二种我们也很常见,vo对象扩展我们的实体类,新增属性,例如联合对象啥的,也可以通过返回哈希表实现;

第一种我们也可以实现,可以通过注解让一个属性不参与序列化而实现,也可以用一个vo对象,其中只包含实体类的一部分属性,之后通过一个方法,将实体类与vo对象之间进行数据赋值。

2. BeanCopyUtils进行两个对象的数据转移

名字是这样的,我们也可以作用于不是bean对象的呀~

public class BeanCopyUtils {
    private BeanCopyUtils() {
    }

    /** 单个对象*/
    public static <V> V copyBean(Object source, Class<V> clazz) {
        /** 创建目标对象 实现属性拷贝*/
        V result = null;
        try {
            result = clazz.newInstance();
            /** 拷贝*/
            BeanUtils.copyProperties(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    
    /** 集合*/
    public static <O, V> List<V> copyBeanList(List<O> list, Class<V> clazz) {
        /** 创建目标对象 实现属性拷贝*/
        return list.stream()
                .map(o -> copyBean(o, clazz))
                .collect(Collectors.toList());
    }
}
  1. copyBean方法,将第一个参数转换为第二个参数(类对象)的类型
    • 转化逻辑是通过相同的属性名
  2. copyBeanList方法,将第一个参数列表转换为第二个参数(类对象)的类型的列表
    • 转化逻辑是通过相同的属性名

3. mapper层实现

这里我图方便,直接用注解实现mapper方法

示例:

在这里插入图片描述

小开发是这样的,正经开发可不是这样不严谨的喔!

4. service层实现

示例:

在这里插入图片描述

5. vo对象创建

示例:Course对象的表格展示vo对象

@Data
@NoArgsConstructor
@AllArgsConstructor
@ExcelTarget("excelCourse")//表格实体类的id,可以针对一个实体类做不同导出,本文暂时不涉及
public class ExcelCourseVo {

    @Excel(name = "course", width = 20)//列名、宽度
    private String course_name;

    @Excel(name = "credit", width = 20)
    private BigDecimal credit;

    @Excel(name = "school", width = 20)
    private Integer school_year;

    @Excel(name = "semester", width = 20)
    private Integer semester;
}

6. 保存路径配置

在这里插入图片描述

public class Constants {

    // excel表
    public static final String XLSX_DIR = "D:\\study\\excel";

    public static final String XLSX_NAME1 = "easypoi1.xlsx";
    public static final String XLSX_NAME2 = "easypoi2.xlsx";
    public static final String XLSX_NAME3 = "easypoi3.xlsx";
    public static final String XLSX_NAME4 = "easypoi4.xlsx";

}

7. controller层核心代码实现

示例:

@GetMapping("/print")
@ApiOperation("打印表格")
public void print() {
    List<Course> list = courseService.selectAll();
    List<ExcelCourseVo> excelCourseVos = BeanCopyUtils.copyBeanList(list, ExcelCourseVo.class);
    // 导出
    ExportParams params = new ExportParams();
    params.setTitle("测试");
    // 表格左下角sheet名称
    params.setSheetName("课程信息");
    Workbook workbook = ExcelExportUtil.exportExcel(params, ExcelCourseVo.class, excelCourseVos);
    try{
        // 文件夹是否存在,若没有对应文件夹直接根据路径生成文件会报错
        File folder = new File(Constants.XLSX_DIR);
        if (!folder.exists() && !folder.isDirectory()) {
            folder.mkdirs();
        }
        // 文件是否存在
        File file = new File(Constants.XLSX_DIR + "\\" + Constants.XLSX_NAME1);
        if (!file.exists()){
            file.createNewFile();
        }
        // 输出流写入(覆盖)
        FileOutputStream outputStream = new FileOutputStream(Constants.XLSX_DIR + "\\" + Constants.XLSX_NAME1);
        workbook.write(outputStream);
        // 关闭写,不然用户点击生成的文件会显示只读
        outputStream.close();
        workbook.close();
    }catch (IOException e){
        e.printStackTrace();
    }
    System.out.println("打印成功");
}

8. wagger接口

示例:

在这里插入图片描述

找到对应目录:

在这里插入图片描述

导出成功:

在这里插入图片描述

9. 补充

你如果比较懒,那就用原始的那个实体类对象就行了:

  • 因为实体类和vo对象在程序眼里都是自定义的类罢了,只是我们人为的给他们意义

在这里插入图片描述

效果:

在这里插入图片描述

强烈注意: 对表格的列名起名要正常,可以是中文啥的,但是不要出现一些奇奇怪怪的字符,例如下划线就不行,这是我血的教训😔😔😔


文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

代码:memory · 游离态/马拉圈2023年10月 - 码云 - 开源中国 (gitee.com)


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

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

相关文章

048:mapboxGL本地上传geojson文件,在map上解析显示图形

第048个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中本地上传geojson文件,通过mapbox加载geojson数据的方法解析,在地图上显示图形。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共112行)相关API…

39 本书助力精益成长

目录 ​编辑 Idea - 思考者的世界处处都是台风口 人才 - 所有的问题,归根结底都是人的问题 产品 - 不仅要满足需求,还要满足想象力

云上攻防-云原生篇KubernetesK8s安全APIKubelet未授权访问容器执行

文章目录 K8S集群架构解释&#xff08;见上图参考&#xff09;K8S集群攻击点(见上图参考)-重点API Server未授权访问&kubelet未授权访问复现 K8S集群架构解释&#xff08;见上图参考&#xff09; Kubernetes是一个开源的&#xff0c;用于编排云平台中多个主机上的容器化的…

[动手学深度学习]生成对抗网络GAN学习笔记

论文原文&#xff1a;Generative Adversarial Nets (neurips.cc) 李沐GAN论文逐段精读&#xff1a;GAN论文逐段精读【论文精读】_哔哩哔哩_bilibili 论文代码&#xff1a;http://www.github.com/goodfeli/adversarial Ian, J. et al. (2014) Generative adversarial network…

【Kotlin精简】第3章 类与接口

1 简介 Kotlin类的声明和Java没有什么区别&#xff0c;Kotlin中&#xff0c;类的声明也使用class关键字&#xff0c;如果只是声明一个空类&#xff0c;Kotlin和Java没有任何区别&#xff0c;不过定义类的其他成员会有一些区别。实例化类不用写new&#xff0c;类被继承或者重写…

如何开始使用 Kubernetes RBAC

基于角色的访问控制 (RBAC) 是一种用于定义用户帐户可以在 Kubernetes 集群中执行的操作的机制。启用 RBAC 可以降低与凭证盗窃和帐户接管相关的风险。向每个用户授予他们所需的最低权限集可以防止帐户拥有过多的特权。 大多数流行的 Kubernetes 发行版都从单个用户帐户开始,…

值得拥有的 12 大最佳照片恢复软件 [持续更新]

由于误删、损坏、病毒攻击等原因&#xff0c;您可能会丢失珍贵的照片。幸运的是&#xff0c;市场上有专业的照片恢复工具。但是&#xff0c;根据您的需要找到合适的照片恢复软件的任务可能压力很大。为了帮助您做出正确的决定&#xff0c;我们精心挑选了您可以信赖的收费最高的…

opencv 图像识别 指纹识别 - python 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器视觉的指纹识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&#xff0c;适…

STM32Cube高效开发教程<基础篇>(四)----GPIO输入/输出

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、 GPIO功能…

Vue3 + Nodejs 实战 ,文件上传项目--实现文件批量上传(显示实时上传进度)

目录 技术栈 1.后端接口实现 2.前端实现 2.1 实现静态结构 2.2 整合上传文件的数据 2.3 实现一键上传文件 2.4 取消上传 博客主页&#xff1a;専心_前端,javascript,mysql-CSDN博客 系列专栏&#xff1a;vue3nodejs 实战--文件上传 前端代码仓库&#xff1a;jiangjunjie…

城市消防无人机控制系统的设计

目录 摘 要......................................................................................................................... 2 第一章 绪论.............................................................................................................…

Qt 5.12.12 静态编译(MinGW)

前置准备 系统环境 版本 Windows 11 专业版 版本 22H2 安装日期 ‎2023/‎6/‎18 操作系统版本 22621.2428 体验 Windows Feature Experience Pack 1000.22674.1000.0依赖工具 gcc Qt 5.12.12 安装 MinGW 后自动安装 https://download.qt.io/archive/qt/5.12/5.12.12/qt-ope…

【C/C++数据结构 - 2】:稳定性与优化揭秘,揭开插入排序、希尔排序和快速排序的神秘面纱!

文章目录 排序的稳定性插入排序插入排序的优化 希尔排序快速排序 排序的稳定性 稳定排序&#xff1a;排序前2个相等的数在序列中的前后位置顺序和排序后它们2个的前后位置顺序相同。&#xff08;比如&#xff1a;冒泡、插入、基数、归并&#xff09; 非稳定排序&#xff1a;排…

【Linux】自旋锁 以及 读者写者问题

自旋锁 以及 读者写者问题 一、自旋锁1、其他常见的各种锁2、自旋锁相关的API函数 二、读者写者问题1、读者与写者的关系2、读写锁的API函数3、用伪代码理解读写锁的原理4、读写锁的演示使用 一、自旋锁 1、其他常见的各种锁 悲观锁&#xff1a;在每次取数据时&#xff0c;总是…

Docker 构建Python镜像时,pip使用国内地址的dockerfile模版

一、问题现象 构建镜像时&#xff0c;使用pip命令打包报错&#xff1a; 二、问题根因 因国内无法访问pip的配置文件中的仓库地址 三、解决办法 这个办法同样适用于&#xff1a;物理机&#xff0c;这个地址是阿里云的 pip config set global.index-url http://mirrors.aliy…

<C++> IO流

C语言的输入与输出 在C语言当中&#xff0c;我们使用最频繁的输入输出方式就是scanf与printf&#xff1a; scanf&#xff1a; 从标准输入设备&#xff08;键盘&#xff09;读取数据&#xff0c;并将读取到的值存放到某一指定变量当中。printf&#xff1a; 将指定的数据输出到…

idea自动封装方法

例如 package com.utils;import java.lang.reflect.Field; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle;/*** author hrui* date 2023/10/13 13:49*/ public class DBUtils {private static ResourceBundle bund…

【网络编程】Linux网络编程基础与实战第二弹——Socket编程

Socket编程套接字概念套接字通讯原理 网络编程接口网络字节序sockaddr数据结构socket函数bind函数listen函数accept函数connect函数 ) Socket编程 套接字概念 Socket本身有“插座”的意思&#xff0c;在Linux环境下&#xff0c;用于表示进程间网络通信的特殊文件类型。本质为…

多机器人三角形编队的实现

文章目录 前言一、机器人编队前的准备二、配置仿真环境2.编写机器人编队.cpp文件 三、三角形编队测试 前言 前阵子一直想要实现多机器人编队&#xff0c;找到了很多开源的编队代码&#xff0c;经过好几天的思索&#xff0c;终于实现了在gazebo环境中的TB3三角形机器人编队。 一…

prostate数据集下载

1. prostatex 下载地址&#xff1a;https://wiki.cancerimagingarchive.net/pages/viewpage.action?pageId23691656 比赛&#xff1a;https://prostatex.grand-challenge.org/ 这个下载的是一个tcia文件&#xff0c;参考这篇文章打开该文件 2. promise12 地址&#xff1a;…