这次的培训将上次的一些抽象概念具化了,实操后看似有些理解了。但是自己闭眼再去回想整个流程,还是有着大大的疑惑,这些疑惑一方面来自与编程语言的不熟练,也来自对项目业务的不了解等等。
1.inforance(基础核心层)
1.1.config
config,配置包。例如web-interceptor
1.2.database
database是面向数据库层面的。其中-DO是数据库容器,与数据库一一对应。
-Mapper是Mybatis或Plus操作数据库的SQL。MapperHelper:面向数据库层面的缓存服务类。MapperEnum字段枚举类:比如说,User表有一个identify字段,他只有三种值(管理员、用户、客服)
其中用到了新的注解@Data,@ToString去替代往常的getset和tostring方法。
枚举类:一种数据存放方式,针对一些数据类型,枚举类有时候会起到比较重要的作用
public enum StructureType {
BRIDGE("桥梁"), TUNNEL("隧道"), CULVERT("涵洞");
public final String value;
StructureType(String value) {
this.value = value;
}
public String getValue() { return value; }
public static StructureType parseType(String type) throws Exception {
switch (type){
case "桥梁":
case "大桥":
return StructureType.BRIDGE;
case "隧道":
return StructureType.TUNNEL;
case "涵洞":
return StructureType.CULVERT;
default:
throw new Exception("工程结构节点类型解析失败");
}
}
}
1.3.util
util是各种通用工具类的包,这次使用到了SnowFlakeUtil,不重复的随机数生成器。
2.Structure
以structure去描述其他结构
2.1.adapter
2.1.1.adapter-anticorrosive
防腐层保证application的功能性。
2.1.2.adapter-controller:接口开放
@RestController
@RequestMapping("/structure")
public class StructureController {
@Autowired
private StructureService structureService;
@GetMapping("/queryStructure/{structureNodeCode}")
public StructureOutDTO queryStructure(@PathVariable(value = "structureNodeCode") String structureNodeCode){
QueryParamInDTO queryParamInDTO = new QueryParamInDTO();
queryParamInDTO.setStructureNodeCode(structureNodeCode);
StructureOutDTO outDto = structureService.getByNodeCode(queryParamInDTO);
return outDto;
}
2.2.application
2.2.1.application-service-dto-InDTO
用来处理用户的输入,同时可以对这些输入参数进行一些方法处理
@Data
//param:参数
public class QueryParamInDTO {
private String structureNodeCode = "1609494750145155072";
private String role = "普通管理员";
private String color = "红色";
public boolean isValid(){
if(structureNodeCode == null || structureNodeCode.equals(""))
return false;
if(role == null || role.equals(""))
return false;
return true;
}
}
2.2.2.application-service-dto-OutDTO
用于处理一些返回结果集,这些结果集是通过接口发送给前端的结果,可以根据具体需求自由设计。
@Data
public class StructureOutDTO {
private String id ; // 唯一标识
private String code; // 桥梁自定义编码-用于外连接-连接到工程结构树节点中的结构物节点上
private String structureCode; // 结构物编码-数据对接专用-TDengine超级表名需要
private String structureName; // 结构物名称
private double longitude; // 经度
private double latitude; // 纬度
private String structureType; // 结构物类型-根据数据字典:桥梁、隧道、边坡、涵洞...
private String address; // 结构物准确地址描述
//传感器数量
private long sensorCount;
//额外数据
private Date queryTime;//查询时间
private String role;
private String color;
public static StructureOutDTO generate(Structure structure,String role,String color){
StructureOutDTO outDto = new StructureOutDTO();
//这个方法相当于set操作
BeanUtils.copyProperties(structure,outDto);
outDto.setQueryTime(new Date(System.currentTimeMillis()));
outDto.setRole(role);
outDto.setColor(color);
return outDto;
}
public static StructureOutDTO generate(Structure structure,String role,String color){
*****
}
在Java中,static关键字可以用来修饰类的成员变量、方法和代码块,它的作用是将这些成员标记为静态的,即与类相关而不是与类的实例相关。使用static关键字可以在不创建类的实例的情况下访问类的成员变量和方法。
2.2.3application-service-StructureService
用于处理具体的业务需求,比如根据一些系统用户的身份去赋予相对应的权限。
public StructureOutDTO getByNodeCode(QueryParamInDTO param){
if(!param.isValid()){
throw new Exception("输入的结构物code不能为空");
}
Structure structure = structureReader.getByNodeCode(param.getStructureNodeCode());
System.out.println(" 原始经纬度 - 经度" + structure.getLatitude() + "纬度:" + structure.getLongitude());
2.3.domain
domain领域层,把零碎的、分散的基础信息,组建成完整的专业领域会定义一些本专业的专业名词,最为核心的地方。
2.3.1.domain-reader
做所有的数据库读操作,组织各个数据表的数据结构,封装成专业名词:参数校验、分页、数据封装、无效数据剔除。最终才能输出我们想要的领域专业类。
//根据输入的NodeCode查询相应的结构物信息
public Structure getByNodeCode(String structureNodeCode){
LambdaQueryWrapper<StructureDO> lqw = new LambdaQueryWrapper<>();
lqw.eq(StructureDO::getCode,structureNodeCode);
StructureDO record = structureMapper.selectOne(lqw);
//获取传感器数量
LambdaQueryWrapper<SensorDO> lqw1 = new LambdaQueryWrapper<>();
lqw1.eq(SensorDO::getCode,structureNodeCode);
Long sensorCount = sensorMapper.selectCount(lqw1);
Structure structure = Structure.generateStructure(record,sensorCount);
return structure;
}
2.3.1.domain-reader-entity
根据业务需要,去根据-DO类整合数据项,封装成专业名词
@Data
public class Structure {
private String id ; // 唯一标识
private String code; // 桥梁自定义编码-用于外连接-连接到工程结构树节点中的结构物节点上
private String structureCode; // 结构物编码-数据对接专用-TDengine超级表名需要
private String structureName; // 结构物名称
private double longitude; // 经度
private double latitude; // 纬度
private String structureType; // 结构物类型-根据数据字典:桥梁、隧道、边坡、涵洞...
private String address; // 结构物准确地址描述
//传感器数量
private long sensorCount;
//返回的是Structure类型
public static Structure generateStructure(StructureDO structureDO,long sensorCount){
Structure structure = new Structure();
//简化了Sensor中的set操作
BeanUtils.copyProperties(structureDO,structure);
structure.setSensorCount(sensorCount);
return structure;
}
2.3.2.domain-writer
domain-writer:参考reader,做所有的增删改操作.和reader超级像,但是本质不一样,writer做的是对数据库中数据的变动,而reader是对数据库中数据的的读取。
此处不粘贴代码,没啥子意义。
小结-1
在面对一个崭新的项目,有了其数据库结构后。操作流程大抵是,首先处理inforance,去处理相应的DO,Mapper,将数据拿过来。然后处理domain层,做好数据专有名词的设计。接着去application层,做输入输出和业务需求,最后去到adapter层去开放接口。
在整个实操中,感觉自己并不能很熟练的使用那些已经写好的类或者接口,还有那些数据的处理,一些List或者foreach等等这些编程语法也有些困扰。这些数据集往往都是存放在数组中的,比如下面的通过add去收集数据。
List<Sensor> result = new ArrayList<>();//收集数据-1
for (SensorDO record : records) {
//去获取一条数据的MonitorSchemeId
String monitorSchemeId = record.getMonitorSchemeId();
//根据MonitorSchemeId去查询monitorScheme的数据集
MonitorSchemeDO monitorScheme= monitorSchemeMapper.getById(monitorSchemeId);
Sensor sensor = Sensor.generateSensor(record, monitorScheme);
// System.out.println(" 打印结果" + sensor);
result.add(sensor);//收集数据-2
}
return result;//返回收集数据-3
}
作业(开放了三个接口,新增了输入项color,role用来做接口的识别)
小结-2
这次的学习相比于上次少了很多疑问,对于各种层级关系有了理解,当自己去实现某种功能时候,大概知道去那个包中读取数据了,也明确了reader,writer,DTO中的一些方法的含义和作用。但是对于一些语法,一些函数运用还是比较生疏,以及一些业务逻辑不是很明确,这一点体现在service层,对于这一层感觉有些不明确。对于整个课程所讲内容,感觉需要不断地去重复,去理解。
作业-2
基于t_zs_monitoring_program_manage表去设计了插入操作,通过-mapper去设计插入sql语言,writer去执行插入操作,CreateEntity去保存writer中的插入数据集。service去执行业务逻辑,DTO设计了用户输入数据,controller去开放接口,通过post请求返回数据实现数据的插入