🍃 场景前言
🐠一般而言,某个简单查询接口涉及到得表结构不超过三个。如果不是单表操作的话,多个表中间用到联合查询的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;
}
🌲 业务沟通
🌐其实在开发工作中,并不是什么技术问题让我们举步维艰,很多时候是没有理解透行业中的各个业务流程,所以不管是前后端,还是跟需求的沟通也好,业务环节相当滴重要。虽然说我们目前是处在开发工作者的阶段,但是个人的发展规划中还是会要计划往项目管理者或者系统架构师的方向努力的。将行业业务理顺并结合我们自身的开发经验,是我们需要走出的关键一步路!
🍆🍆🍆路过的小伙伴,如果本篇博文对你的学习或者工作有所帮助,可以点赞+收藏+关注一波呀~👊👊👊小编后续每过一段时间会整理出相关项目实例的博文,感谢您的支持哦!!!✈️✈️✈️