地震台控制系统 Earthquake monitoring(新人练手Spring Boot + Spring MVC + Mybatis)
Spring Boot入门小项目,根据学校期间的作业进行一个小的修改。本来学校是要求在BlueJ上进行本地运行的小作业,但是不管在学习还是校招的过程中都显得太简单,没什么可以总结和给他人介绍的价值。因此想着一边学习框架一边动手实践一下。
一、工程涉及技术:
前端: HTML
框架: Spring Boot + Spring MVC + Mybatis
开发环境: IndelliJ IDEA+MAVEN
数据库: MySql
语言: JAVA,HTML,SQL
二、 项目需求:
原题是为了科学家方便观察全球的地震数据,在本地开发一个地震台观测系统。
实现的功能:
1、可以输入观测站的信息;
2、可以输入地震的数据;
3、可以提供所有观测站中观测到的最大平均地震;
4、可以提供观测到的最大震级;
5、给出一个目标震级,可以得到大于目标震级的震级值。
主要对象和属性如下:
地震:编号,震级,经度,纬度 ,发生时间
之所以在地震属性中增加了ob_earth 所在观测台的属性,是因为在数据库中需要建立1对n的对应关系,作为外键进行添加。本来题意是想在Observatory中设置List来存储Earthquake,这一点进行了更改。
private int id;//地震编号
private double magnitude;//震级
private double latitude;//经度
private double longitude;//纬度
private String year;//时间
private String ob_earth;//所在观测台
观测台 :编号,名字,观测台所在国家,开始观测的时间
private int id_o;//观测台编号
private String name;//观测台名字
private String country;//所在国家
private String year;//开始观测时间
预期结果:
三、项目结构
java文件中包含如下:
Entity层: 包含实体属性,例如Earthquake类中包含,magnitude,latitude等;
DAO层: 主要进行数据操作,封装以及与数据库进行联络的工作。通过定义接口,通过接口被调用,实现数据的处理;
Service层: 负责业务模块的逻辑应用设计,用来处理业务;
Controller层: 调用Service接口来对业务模块流程进行控制;
因为本文没有用到JSP,所以没有单独设置View层,而是通过导入Thymeleaf包实现Controller层与resource/templates/site中的HTML文件进行结合,实现数据从前端的导出与导入。
四、设计思路与步骤如下(以某一条功能举例):
首先对Entity中的实体类进行设计与构建,主要是添加实体属性,get和set方法,为控制反转(依赖注入)的实现做准备:
第二步 设计DAO层,定义接口:
例如:
//提供目标级数,求大于目标级数数据
List<Earthquake> selectTargetMag(double num);//已测试
第三步 在resource/mapper中通过xml文件实现DAO层中接口的具体内容,并且通过mapper中的xml文件实现数据库与项目的数据交互:
例如:
这里的返回类型本应该是Earthquake,但是以Earthquake作为返回值String类型属性的结果会是null。因为Mybatis会根据查询列名去在实体类中查找相应的set方法设置值,然而,数据库是不区分大小写的,并且会将列名转换为小写,因此使用resultMap可以避免返回值为null的情况。
(参考文档:https://blog.csdn.net/m0_47734729/article/details/107728737)
第四步 在service层中进行逻辑应用设计,在本工程中更多的表现为进行mapper入参的非空判断,调用mapper方法。
@Autowired
private EarthquakeMapper earthquakeMapper;
public List<Earthquake> findTargetMag(Double num){
if(num==null){
throw new IllegalArgumentException("参数不能为空");
}
return earthquakeMapper.selectTargetMag(num);
}
我出现过的错误:自动装配失败。在这里,刚开始进行练习的时候,可能会出现装配失败的情况,这一点大概率问题出现在xml文件与DAO层、Entity层的参数出现差异,细心对照改正可能就能解决大部分的错误情况。
第五步 调用Service接口来业务流程进行控制,完成与前端数据交互的最后一步准备工作。
@Autowired
private EarthquakeMapperService earthquakeMapperService;
@GetMapping(path="/getInsert")
public String getInsertPage(){
return "/site/index";
}
@GetMapping("/getTargetMag")
public String getTargetMag(Model model,
@RequestParam(value = "num",required = false) Double num){
List<Earthquake> list=earthquakeMapperService.findTargetMag(num);
List<Map<String,Object>> earthquakeT = new ArrayList<>();
if(earthquakeT!=null){
for(Earthquake earthquake : list){
Map<String,Object> map=new HashMap<>();
map.put("Earthquake",earthquake);
earthquakeT.add(map);
}
}
model.addAttribute("earthquake",earthquakeT);
return "/site/index";
}
第六步(最好先设计好想要呈现数据和实现操作的页面)将HTML中对应获取数据的模块配置Thymeleaf。
最终运行*Application(最好先在test文件中测试Service层的功能是否完成,再部署到Controlle层r中),并且找到对应网页即可。
五、遇到过的问题
数据库中大小排列错误。
遇到过的一个有意思的问题是,我在数据库中插入过不同的震级(magnitude)值(例如9.0,10.0),但是当我用SQL取最大值时,得到的竟然是9.0。后来我插入多个数据得到排序是按照第一个数字,第二个数字的排列顺序排列的。(99.0,80.0,7.0,101.0等等)错误原因是在写数据库的时候,magnitude的数据类型我定义成了varchar类型,导致排序并不是按照数字大小进行排序的。将varchar给成double类型,问题便得以解决。