如何动态生成列字段?请看向这里哟

news2024/11/26 2:53:57

🍃 场景前言

    🐠一般而言,某个简单查询接口涉及到得表结构不超过三个。如果不是单表操作的话,多个表中间用到联合查询的SQL也可以解决相关问题。但是,事与愿违的是我们的业务是跟着场景走的,并不是所有的业务就仅仅让我们用两三张表就解决问题了。正如我们公司的首席领导对我们灌输的一个行业道理便是:“技术为本,场景为王”! 本人是非常认同这种说法的,因为没有好的业务场景,我们开发人员拥有良好的开发技术也没有用武之地。我本人是做交通领域的工作,中间涉及到有各种各样的交通检测设备,每类设备所生成的数据字段各异,有流量、气象、通信、控制、收费等数据类型,当然这么多的数据类型不可能放在一个表中存储,毕竟很多数据都是实时更新的数据。这个时候如果需要实时监测这么多表结构中的数据是否实时更新时,可能一次性要检测的表结构是有十多个了。

🍀 问题导向

    🐟就后端接口而言,应当是根据各个设备类型做切换,一个接口也是能搞定的事情,查询的表结构相对而言多一些,xml中撰写的sql比较多罢了。但是,就前端展示界面而言,这其实是我在之前的项目中没有遇到过的问题:“每个数据类型应当就是一个展示界面,因为中间涉及到的数据字段都互不相同。如果我们只是将每个表中查询到的最近时间的实时数据返给前端这边,前端同事无法判断界面上的需要展示的各个列字段具体是哪些。也可以这样认为:这个功能界面其实是个动态字段界面,不仅仅是数据动,还需要包括数据字段也要跟着变动。”

🌷 解决方向

    🐬这个问题在想到解决办法之前是经过深思熟虑并且再三向前端同事确认(争论)(折磨)后才想到的点子,因为之前未去接触过这样的业务,我还是认为只要是将数据返回后,前端想怎么处理数据都可以。可能是我一开始没有注意到前端需要怎样的数据格式吧,问题也没有那么复杂,就是每个数据类型的数据接口返回之前,在所有数据返回之前加上一个所有列字段的集合即可,这样子前端每次拿到数据的时候都可以得到。O(∩_∩)O哈哈~,找准方向后,我们想着如何将列字段返回即可啦!每个数据表都会有对应的实体类,联想如何拿到字段名称呢?没错,借助 “Java反射” 这一强大机制就可以解决问题,因为所对应的字段名称就是我们所建立实体类中的成员变量。Reflection(反射)是Java语言特征之一,它允许运行中的程序对自身进行检查,可以在运行时获取某个类的所有信息,其中包括成员变量、成员方法、构造器等,并且还可以操纵类的变量、方法、构造器等部分。

🌳 实际操作

    🐡前面将场景+问题+方法都阐述了一遍,下面将就实际的业务代码进行实例描述:
1️⃣ 由于每个数据类型的操作方式都是差不多的,所以下面的代码展示部分只解释了某一个数据类型如何动态获取列字段的过程,其他的查询、赋值操作属于正常操作,小伙伴应该也是不在话下,可以不做过多的解释。

	//从数据库中查询我们需要的数据:
	List<CarFlowData> carFlowDataList = deviceDisplayMapper.selectCarFlowDataList(deviceSnCode,addressIp,deviceTypeCode);
	DeviceDisplay deviceDisplay0501 = new DeviceDisplay();
	//新建列字段集合
	List<RowData> rowDataList05 = new ArrayList<>();
	//获取本类定义的成员变量,包括私有,但不包括继承的变量
	Field[] field05 = CarFlowData.class.getDeclaredFields();
	//遍历本类中所有的成员变量
	for (int i = 0; i < field05.length; i++) {
	    RowData rowData = new RowData();
	    rowData.setRowDataName(field05[i].getName());
	    rowDataList05.add(rowData);
	}
	//将列字段集合set到返回类中
	deviceDisplay0501.setDeviceDisplayRowDataList(rowDataList05);
	deviceDisplay0501.setDeviceDisplayName(carFlowDataName);
	deviceDisplay0501.setDeviceDisplayList(carFlowDataList);
	//将其中需要展示的某类add到展示集合中
	deviceDisplayList.add(deviceDisplay0501);
	return deviceDisplayList;

2️⃣ 因为需要有一个通用类用来存储每个数据类型列字段的名称,所以这个类的建立少不了哒!

@Data
public class RowData {
    @ApiModelProperty("列数据名称")
    private String rowDataName;
}

3️⃣ 下面的类是最终的返回类,中间涉及到每个数据类型的名称、列字段名称数据、以及我们需要展示的子数据集合。不知道小伙伴们是否也是这样设计的呢?不管怎么说,只要将功能点实现的方法都是好点子啦!

@Data
public class DeviceDisplay {

    @ApiModelProperty("表名称")
    private String deviceDisplayName;

    @ApiModelProperty("列数据")
    private List<RowData> deviceDisplayRowDataList;

    @ApiModelProperty("子数据集合")
    private List<?> deviceDisplayList;

}

🌲 业务沟通

     🌐其实在开发工作中,并不是什么技术问题让我们举步维艰,很多时候是没有理解透行业中的各个业务流程,所以不管是前后端,还是跟需求的沟通也好,业务环节相当滴重要。虽然说我们目前是处在开发工作者的阶段,但是个人的发展规划中还是会要计划往项目管理者或者系统架构师的方向努力的。将行业业务理顺并结合我们自身的开发经验,是我们需要走出的关键一步路!

🍆🍆🍆路过的小伙伴,如果本篇博文对你的学习或者工作有所帮助,可以点赞+收藏+关注一波呀~👊👊👊小编后续每过一段时间会整理出相关项目实例的博文,感谢您的支持哦!!!✈️✈️✈️
在这里插入图片描述

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

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

相关文章

python+django宠物销售商城网站vue

宠物销售商城,在宠物销售商城可以查看首页、商品信息、商品资讯、个人中心、后台管理、购物车、在线客服等内容 用户登录、用户注册,通过注册获取用户名、密码、姓名、联系电话等信息进行注册、登录 商品信息,在商品信息页面可以查看商品名称、商品分类、图片、品牌、规格、价…

java易错题锦集二

源码 补码 int i 5; int j 10; System.out.println(i ~j);有个公式&#xff0c;-n~n1 另一种解题思路 ~代表对n按位取反 10的源码是: 00000000 00000000 00000000 1010 所以对10按位取反就是 11111111 11111111 11111111 0101 由于计算机中-1表示为 11111111 11111111 111…

[docker]笔记-镜像 管理

1、镜像管理 docker search xxxx ①查找镜像,例如查找httpd [rootlocalhost ~]# docker search httpd ②下载镜像 docker pull xxxx [rootlocalhost ~]# docker pull httpd ③列出本地镜像 docker images [rootlocalhost ~]# docker images ④删除镜像 docker rmi xxx…

Linux(十)线程安全 上

目录 一、概念 二、互斥锁实现互斥 三、条件变量实现同步 银行家算法 生产者与消费者模型 一、概念 概念&#xff1a;在多线程程序中&#xff0c;如果涉及到了对共享资源的操作&#xff0c;则有可能会导致数据二义性&#xff0c;而线程安全就指的是&#xff0c;就算对共享…

【MFC】菜单与状态栏(15)

菜单 一般菜单的使用步骤&#xff1a; 1.编辑菜单资源&#xff0c;设置菜单属性&#xff08;包括菜单名和ID&#xff09;&#xff1b; 2.用ClassWizard自动映射菜单消息和成员函数&#xff1b; 3.手工编辑成员函数&#xff0c;加入菜单消息处理代码。 单文档窗口可以设置默…

2年时间,涨薪20k,想拿高薪还真不能老老实实的工作...

2016年开始了我的测试生活。 2016年刚到公司的时候&#xff0c;我做的是测试工程师。做测试工程师是我对自己的职业规划。说实话&#xff0c;我能得到这份工作真的很高兴。 来公司的第一个星期&#xff0c;因为有一个项目缺人&#xff0c;所以部门经理提前结束了我的考核期&a…

C语言预处理

文章目录 目录 文章目录 前言 一、程序编译的过程 二、编译阶段 1.预处理(*.i&#xff09; 2.编译(*.s) 3.汇编(*.o) 4.链接 总结 前言 提示&#xff1a;使用vs code(gcc编译器)与vs2022来演示c语言的预处理 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…

KEIL编译报错,解决方法汇总

目录 背景 最近在跟着野火码uCosiii的代码时&#xff0c;感觉非常完美&#xff0c;结果一编译&#xff0c;报了120个莫名其妙的问题&#xff0c;下面是踩过的坑&#xff0c;一起记录下&#xff0c;免得下次又掉进去了~ 1. 编译汇编文件&#xff0c;报错 error: unexpected t…

看海泰方圆类ChatGPT技术模型!

ChatGPT&#xff0c;上线2个月便以破亿的用户群引爆了全网。 ChatGPT是由OpenAI公司开发的AI聊天机器人程序&#xff0c;于2022年11月底推出&#xff0c;能够通过学习和理解人类的语言来进行对话、互动&#xff0c;甚至能完成撰写邮件、视频脚本、文案、翻译、代码等任务&…

南卡和JBL无线蓝牙耳机哪款更值得买?横向评测后秒懂差距!

蓝牙耳机想必大家都很熟悉&#xff0c;无论是商务办公还是休闲娱乐&#xff0c;它都起到了至关重要的作用。但蓝牙耳机发展速度太快&#xff0c;耳机品质也参差不齐&#xff0c;最近看到大多数人都有一个疑问&#xff1a;买什么蓝牙耳机比较好&#xff1f;作为一个资深的耳机爱…

动态规划:状态压缩DP(2)(P1896 互不侵犯 ,矩阵计数)

文章目录互不侵犯矩阵计数互不侵犯 题目传送门 在NN的棋盘里面放K个国王&#xff0c;使他们互不攻击&#xff0c;共有多少种摆放方案。国王能攻击到它上下左右&#xff0c;以及左上左下右上右下八个方向上附近的各一个格子&#xff0c;共8个格子。 升级版的八皇后问题&#xf…

(一)随处可见的LED广告屏是怎么工作的呢?

笔者前段时间项目上正好用到一块32*128分辨率的单色LED&#xff0c;正式介入开发的时候&#xff0c;才发现网上的资料少之又少&#xff0c;供应商也给不出有价值的参考信息。故打算分成三篇详细的介绍下开发过程中遇到的问题。本篇主要介绍LED屏幕的一些基础信息&#xff0c;第…

C#互联网医院源码 智慧医院小程序源码 在线问诊在线开方源码

互联网医院平台源码 智慧医院管理系统源码 开发环境&#xff1a;ASP.NET C# VS2019 SQL2008 依托于实体医院利用互联网技术对接院内业务信息系统&#xff0c;向患者提供基于线上问诊、预约挂号、缴费结算、医患互动、诊后随访、健康科普和复诊等全面的医疗健康互联网服务。…

关于apifox和postman接口工具我有话要说~~

Apifox 和 Postman 都是流行的接口测试工具&#xff0c;各自有其优势和缺点。Apifox 的优势在于它提供了强大的可视化界面&#xff0c;可以方便地测试和监控 API。它还支持多种请求方式&#xff0c;并且支持对请求和响应进行代码生成。但是&#xff0c;Apifox 的缺点在于它不太…

详解指针(1)(初阶版)

前言&#xff1a;本篇是详解指针&#xff08;1&#xff09;&#xff0c;内容包括&#xff1a;指针是什么&#xff0c;指针和指针类型&#xff0c;野指针 part 1&#xff1a;指针是什么 1 指针就是地址&#xff0c;口语中说的指针通常指的是指针变量 2 指针变量&#xff1a;存…

shiro721——CVE-2019-12422

这两个漏洞主要区别在于Shiro550使⽤已知密钥碰撞&#xff0c;后者Shiro721是使⽤ 登录后rememberMe {value}去爆破正确的key值 进⽽反序列化&#xff0c;对⽐Shiro550条件只要有 ⾜够密钥库 &#xff08;条件⽐较低&#xff09;、Shiro721需要登录&#xff08;要求⽐较⾼鸡肋 …

Unity基于GraphView的行为树编辑器

这里写自定义目录标题概述基于GitHub上&#xff1a;目前这只是做了一些比较基础的功能节点开发&#xff0c;仅仅用于学习交流&#xff0c;非完成品。项目GitHub连接&#xff1a;[https://github.com/HengyuanLee/BehaviorTreeExamples](https://github.com/HengyuanLee/Behavio…

GNSS 精密钟差产品介绍与DCB改正详解

文章目录前言参考前言 IGS 提供的 GNSS 轨道产品和钟差产品的解算基准并非完全一样, 对于精密产品&#xff0c;各 GNSS 系统的参考基准均为双频无电离层组合&#xff1b;对于广播星历&#xff0c;则区分 GPS 类卫星(GPS,Galileo,QZSS) 基于双频无电离组合的伪距以及 BDS 卫星系…

CAPL(vTESTStudio) - DoIP - TCP发送_05

TCP发送 参数定义 版本号:02 FD or 01 FE or 其他任意值数据类型:00 05 or 00 06 or 80 01 or其他任意值数据长度:想要发送的任意长度

Node.js http 模块详解:request 对象

前言 前文介绍了 http 模块的基本用法&#xff0c;主要就是调用 createServer 和 listen 方法来创建和启动服务。要处理具体的 HTTP 请求&#xff0c;就要在 createServer 方法中写点什么。本文来介绍处理请求的两个核心对象之一的 request 。 URL HTTP 协议最早设计出来&am…