新人练手Spring Boot——地震台控制系统 (Earthquake monitoring)

地震台控制系统 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方法,为控制反转(依赖注入)的实现做准备:
Alt


第二步 设计DAO层,定义接口:
在这里插入图片描述
例如:

	//提供目标级数,求大于目标级数数据
    List<Earthquake> selectTargetMag(double num);//已测试

第三步 在resource/mapper中通过xml文件实现DAO层中接口的具体内容,并且通过mapper中的xml文件实现数据库与项目的数据交互:

Alt
例如:
Alt

这里的返回类型本应该是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类型,问题便得以解决。

Github完整项目 链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值