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


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

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

相关文章

JavaFX: 使用本地openjfx包

JavaFX: 使用本地openjfx包 1、注释配置2、下载openjfx包3、导入openjfx的jar包 1、注释配置 build.gradle配置注释&#xff1a; 2、下载openjfx包 下载javaFx地址&#xff1a;https://gluonhq.com/products/javafx/ 3、导入openjfx的jar包

elasticsearch安装

安装elasticsearch 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络&#xff1a; docker network create es-net1.2.加载镜像 elasticsearch的镜像的tar包&#xff1a;点击下载 将其上传到虚拟机中…

电源集成INN3270C-H215-TL、INN3278C-H114-TL、INN3278C-H215-TL简化了反激式电源转换器的设计和制造。

一、概述 InnoSwitch™3-CP系列IC极大地简化了反激式电源转换器的设计和制造&#xff0c;特别是那些需要高效率和/或紧凑尺寸的产品。InnoSwitch3-CP系列将初级和次级控制器以及安全额定反馈集成到单个IC中。 InnoSwitch3-CP系列器件集成了多种保护功能&#xff0c;包括线路过…

gRPC之gRPC Gateway

1、gRPC Gateway etcd3 API全面升级为gRPC后&#xff0c;同时要提供REST API服务&#xff0c;维护两个版本的服务显然不太合理&#xff0c;所以 grpc-gateway 诞生了。通过protobuf的自定义option实现了一个网关&#xff0c;服务端同时开启gRPC和HTTP服务&#xff0c; HTTP服…

京东数据接口:京东数据分析怎么做?

电商运营中数据分析的重要性不言而喻&#xff0c;而想要做数据分析&#xff0c;就要先找到数据&#xff0c;利用数据接口我们能够更轻松的获得比较全面的数据。因此&#xff0c;目前不少品牌商家都选择使用一些数据接口来获取相关电商数据、以更好地做好数据分析。 鲸参谋电商…

2023年中国云计算软件市场规模、市场结构及市场份额情况分析[图]

云计算是分布式计算的一种&#xff0c;指的是通过网络“云”将巨大的数据计算处理程序分解成无数个小程序&#xff0c;然后&#xff0c;通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户。云计算软件类型分为三类&#xff0c;即基础设施即服务、平台即服…

Python算法练习 10.14

leetcode 2095 删除链表的中间节点 给你一个链表的头节点 head 。删除 链表的 中间节点 &#xff0c;并返回修改后的链表的头节点 head 。 长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点&#xff08;下标从 0 开始&#xff09;&#xff0c;其中 ⌊x⌋ 表示小于或等于…

非类型模板参数+模板的特化

目录 一、非类型模板参数 二、模板的特化 &#xff08;一&#xff09;函数模板特化 &#xff08;二&#xff09;类模板举例 1. 全特化 2. 偏特化 一、非类型模板参数 模板参数分类&#xff1a;类型形参与非类型形参。类型形参即&#xff1a;出现在模板参数列表中&#x…

使用docker搭建kafka集群、可视化操作台

单机搭建 1 拉取zookeeper镜像 docker pull wurstmeister/zookeeper 2 启动zookeeper容器 docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper 3 拉取kafka镜像 docker pull wurstmeister/kafka 4 启动kafka镜像 docker…

【玩机】如何修改iPhone充电提示音!最详细简单保姆级教程~ 学费了可替换任意音频做你的专属充电提示音!——后厂村路灯

其实方法很简单&#xff0c;利用快捷指令&#xff0c;获得base64 位的音频文本&#xff0c;然后再充电时播放即可。 视频教程 【玩机】如何修改iPhone充电提示音&#xff01;最详细简单保姆级教程 具体操作如下&#xff1a; 1.首先&#xff0c;网上找到需要设定的音频&#xf…

Flutter笔记:电商中文货币显示插件Money Display

Flutter笔记 电商中文货币显示插件 Money Display 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/1338…

Pulsar 之架构,客户端以及多区域容灾

Pulsar 之架构&#xff0c;客户端以及多区域容灾 架构BrokersClusters元数据存储配置存储区持久存储Apache BookKeeperLedgersLedgers读一致性托管Ledgers 日志存储 Pulsar 代理服务发现 Pulsar client(客户端)客户端设置阶段Reader interface 多区域容灾备份(GEO-REPLICATION)…

Apacheb Shiro 1.2.4反序列化漏洞(CVE-2016-4437)

Apache Shiro 1.2.4反序列化漏洞&#xff08;CVE-2016-4437&#xff09; 1 在线漏洞解读: https://vulhub.org/#/environments/shiro/CVE-2016-4437/2 环境搭建 cd /home/kali/vulhub/shiro/CVE-2016-4437启动&#xff1a; sudo docker-compose up -d # 拉取下载并启动sud…

C# 解决从其他地方迁移项目,引用中大多数包是感叹号的问题

当在 Visual Studio 中复制别人的 C# 项目时&#xff0c;遇到许多包冒感叹号的问题通常是因为缺少相关的 NuGet 包或引用不正确导致的。这会在解决方案资源管理器中的引用下显示感叹号。 解决办法如下&#xff1a; 在 Visual Studio 中打开项目。 在解决方案资源管理器中&…

服务器数据恢复-DS5300存储raid5硬盘出现坏道离线的数据恢复案例

服务器数据恢复环境&#xff1a; 某单位一台DS5300存储&#xff0c;1个主机4个扩展柜&#xff0c;组建了2组RAID5&#xff08;一组27块硬盘&#xff0c;一组23块盘&#xff09;。27块盘的那组RAID5阵列存放Oracle数据库文件&#xff0c;存储系统一共分了11个卷。 服务器故障&a…

Unity基础课程之物理引擎3-碰撞检测案例-吃金币并加分显在UI文本框上

业务逻辑&#x1f4bc;&#xff1a; 这个脚本的主要功能是用于显示和更新主角的得分。在游戏中&#xff0c;玩家需要吃到金币来增加分数&#xff0c;而这个脚本就是负责将得分的变化实时显示在屏幕上的。 程序逻辑&#x1f4bb;&#xff1a; 1️⃣首先&#xff0c;在脚本的开始…

【微服务部署】七、使用Docker安装Nginx并配置免费的SSL证书步骤详解

SSL&#xff08;Secure Socket Layer&#xff0c;安全套接字层&#xff09;证书是一种数字证书&#xff0c;用于加密网站与访问者之间的数据传输。SSL证书是网站安全和可靠性的重要保证&#xff0c;是建立信任和保护用户隐私的重要手段。其作用可以总结为以下几点&#xff1a; …

NginxWebUI runCmd 远程命令执行漏洞复现 [附POC]

文章目录 NginxWebUI runCmd 远程命令执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 NginxWebUI runCmd 远程命令执行漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相…

【机器学习】sklearn对数据预处理

文章目录 数据处理步骤观察数据数据无量纲化缺失值处理处理分类型特征处理连续型特征 数据处理步骤 数据无量纲化缺失值处理处理分类型特征&#xff1a;编码与哑变量处理连续型特征&#xff1a;二值化与分段 观察数据 通过pandas读取数据&#xff0c;通过head和info方法大致查…

【算法|动态规划No.18】leetcode718. 最长重复子数组

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…