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

本文主要是介绍【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 【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)


这篇关于【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/216044

相关文章

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

PostgreSQL数据库密码被遗忘时的操作步骤

《PostgreSQL数据库密码被遗忘时的操作步骤》密码遗忘是常见的用户问题,因此提供一种安全的遗忘密码找回机制是十分必要的,:本文主要介绍PostgreSQL数据库密码被遗忘时的操作步骤的相关资... 目录前言一、背景知识二、Windows环境下的解决步骤1. 找到PostgreSQL安装目录2. 修改p

SpringBoot中使用Flux实现流式返回的方法小结

《SpringBoot中使用Flux实现流式返回的方法小结》文章介绍流式返回(StreamingResponse)在SpringBoot中通过Flux实现,优势包括提升用户体验、降低内存消耗、支持长连... 目录背景流式返回的核心概念与优势1. 提升用户体验2. 降低内存消耗3. 支持长连接与实时通信在Sp

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE