SpringBoot+SqlServer查询接口

news2024/12/30 3:56:56

SpringBoot+SqlServer查询接口

文章目录

  • SpringBoot+SqlServer查询接口
    • 1. pom环境配置
    • 2. common工具包
    • 3. 实体类+接口+映射
    • 4. Service层+Controller层

需求:根据站号查询前一个小时的所有数据,将数据返回格式为Map<String,List<Map<String,String>>>,即 首先是四个参数,每个参数中有12条数据(每5分钟一条数据,一小时12条),每条数据有参数:日期时间,该参数的值。

要求结果处理如下图:

image-20240128185839011

1. pom环境配置

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.zhwy</groupId>
  <artifactId>bdly-3dwind-query</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>

  <name>bdly-3dwind-query Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.6.RELEASE</version>
  </parent>

  <dependencies>

    <!--SQLServer连接-->
    <dependency>
      <groupId>com.microsoft.sqlserver</groupId>
      <artifactId>sqljdbc4</artifactId>
      <version>4.0</version>
    </dependency>

    <!--Lombok引入-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>


    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
    </dependency>

    <!--myabtis-->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>2.3.0</version>
    </dependency>


    <!--web 支持-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!--jsp页面使用jstl标签-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
    </dependency>

    <!--用于编译jsp-->
    <dependency>
      <groupId>org.apache.tomcat.embed</groupId>
      <artifactId>tomcat-embed-jasper</artifactId>
      <scope>provided</scope>
    </dependency>
    <!--springboot用JPA连接mysql数据库-->

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>bdly-3dwind-query</finalName>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

2. common工具包

common工具包

结果返回Result.java

package com.zhwy.common;

import lombok.Data;

/**
 * @author xjz_2002
 * @version 1.0
 */
@Data
public class Result<T> {

    //返回码
    private Integer code;

    //返回消息
    private String message;

    //返回数据
    private T data;


    public Result(){}

    // 返回数据
    protected static <T> Result<T> build(T data) {
        Result<T> result = new Result<T>();
        if (data != null)
            result.setData(data);
        return result;
    }

    public static <T> Result<T> build(T body, Integer code, String message) {
        Result<T> result = build(body);
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        return result;
    }

    public static<T> Result<T> ok(){
        return Result.ok(null);
    }

    /**
     * 操作成功
     * @param data
     * @param <T>
     * @return
     */
    public static<T> Result<T> ok(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.SUCCESS);
    }

    public static<T> Result<T> fail(){
        return Result.fail(null);
    }

    /**
     * 操作失败
     * @param data
     * @param <T>
     * @return
     */
    public static<T> Result<T> fail(T data){
        Result<T> result = build(data);
        return build(data, ResultCodeEnum.FAIL);
    }

    public Result<T> message(String msg){
        this.setMessage(msg);
        return this;
    }

    public Result<T> code(Integer code){
        this.setCode(code);
        return this;
    }
}

DataType 枚举类

package com.zhwy.common;

import com.zhwy.pojo.SurfChnMulMin;

import java.util.Map;

import static com.zhwy.common.Tool.toStr;

/**
 * @author xjz_2002
 * @version 1.0
 */
public enum DataType {
    PRE("pre"), TEM("tem"), RHU("rhu"), WIN("win");

    private final String code;

    DataType(String code) {
        this.code = code;
    }

    // 基于数据类型填充数据的方法
    public void populateData(Map<String, String> dataMap, SurfChnMulMin scmm) {
        switch (this) {
            case PRE:
                dataMap.put(code, toStr(scmm.getPre()));
                break;
            case TEM:
                dataMap.put(code, toStr(scmm.getTem()));
                break;
            case RHU:
                dataMap.put(code, toStr(scmm.getRhu()));
                break;
            case WIN:
                dataMap.put("win_D", toStr(scmm.getWinDAvg2mi()));
                dataMap.put("win_S", toStr(scmm.getWinSAvg2mi()));
                break;
            // 根据需要添加更多数据类型
        }
    }
}

ResultCodeEnum 枚举返回结果类

package com.zhwy.common;

import lombok.Getter;

/**
 * @author xjz_2002
 * @version 1.0
 */
@Getter
public enum ResultCodeEnum {


    SUCCESS(200,"成功"),
    FAIL(201, "失败"),
    SERVICE_ERROR(2012, "服务异常"),
    DATA_ERROR(204, "数据异常"),
    ILLEGAL_REQUEST(205, "非法请求"),
    REPEAT_SUBMIT(206, "重复提交"),
    ARGUMENT_VALID_ERROR(210, "参数校验异常"),

    LOGIN_AUTH(208, "未登陆"),
    PERMISSION(209, "没有权限"),
    ACCOUNT_ERROR(214, "账号不正确"),
    PASSWORD_ERROR(215, "密码不正确"),
    LOGIN_MOBLE_ERROR( 216, "账号不正确"),
    ACCOUNT_STOP( 217, "账号已停用"),
    NODE_ERROR( 218, "该节点下有子节点,不可以删除")
    ;

    private Integer code;

    private String message;

    private ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

}

Tool 工具类

package com.zhwy.common;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * @author xjz_2002
 * @version 1.0
 */
public class Tool {
	
    public static String toStr(Object obj) {
        String result = "";
        if (obj == null) {
            result = "0";
        } else {
            result = obj.toString();
        }
        return result;
    }

}

3. 实体类+接口+映射

pojo实体类 SurfChnMulMin.java

package com.zhwy.pojo;

import com.fasterxml.jackson.annotation.JsonFormat;

import java.io.Serializable;
import java.util.Date;

public class SurfChnMulMin implements Serializable {
    private String stationIdC;
    private String stationName;
    private Date datetime;
    private Double pre;
    private Double tem;
    private Double rhu;
    private Double winDAvg2mi;
    private Double winSAvg2mi;

    public SurfChnMulMin() {
    }

    public SurfChnMulMin(String stationIdC, String stationName, Date datetime, Double pre, Double tem, Double rhu, Double winDAvg2mi, Double winSAvg2mi) {
        this.stationIdC = stationIdC;
        this.stationName = stationName;
        this.datetime = datetime;
        this.pre = pre;
        this.tem = tem;
        this.rhu = rhu;
        this.winDAvg2mi = winDAvg2mi;
        this.winSAvg2mi = winSAvg2mi;
    }

    public String getStationIdC() {
        return stationIdC;
    }

    public void setStationIdC(String stationIdC) {
        this.stationIdC = stationIdC;
    }

    public String getStationName() {
        return stationName;
    }

    public void setStationName(String stationName) {
        this.stationName = stationName;
    }

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    public Date getDatetime() {
        return datetime;
    }

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    public void setDatetime(Date datetime) {
        this.datetime = datetime;
    }

    public Double getPre() {
        return pre;
    }

    public void setPre(Double pre) {
        this.pre = pre;
    }

    public Double getTem() {
        return tem;
    }

    public void setTem(Double tem) {
        this.tem = tem;
    }

    public Double getRhu() {
        return rhu;
    }

    public void setRhu(Double rhu) {
        this.rhu = rhu;
    }

    public Double getWinDAvg2mi() {
        return winDAvg2mi;
    }

    public void setWinDAvg2mi(Double winDAvg2mi) {
        this.winDAvg2mi = winDAvg2mi;
    }

    public Double getWinSAvg2mi() {
        return winSAvg2mi;
    }

    public void setWinSAvg2mi(Double winSAvg2mi) {
        this.winSAvg2mi = winSAvg2mi;
    }
}

Mapper接口 ScmmMapper

package com.zhwy.mapper;

import com.zhwy.pojo.SurfChnMulMin;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @author xjz_2002
 * @version 1.0
 */
@Mapper
public interface ScmmMapper{
    //获取最近一小时所有数据
    List<SurfChnMulMin> getScmmList(
            @Param("startTime") String startTime,
            @Param("endTime") String endTime,
            @Param("staId") String staId
    );

    //获取最新时间
    Date getScmmNewDate(
            @Param("staId") String staId
    );

}

Resouces/mapper/ScmmMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >

<mapper namespace="com.zhwy.mapper.ScmmMapper">
    <select id="getScmmList" resultType="com.zhwy.pojo.SurfChnMulMin">
        SELECT Station_Id_C,
               Station_Name,
               Datetime,
               PRE,
               RHU,
               TEM,
               WIN_D_Avg_2mi,
               WIN_S_Avg_2mi
        FROM SURF_CHN_MUL_MIN
        WHERE (Datetime &gt;= #{startTime} AND Datetime &lt;= #{endTime})
          AND Station_Id_C = #{staId}
    </select>

    <select id="getScmmNewDate" resultType="java.util.Date">
        SELECT Datetime
        FROM SURF_CHN_MUL_MIN
        WHERE Station_Id_C = #{staId}
          AND Datetime = (SELECT MAX(Datetime)
                          FROM SURF_CHN_MUL_MIN)
    </select>

</mapper>

4. Service层+Controller层

service层 ScmmService.java

package com.zhwy.service;

import com.zhwy.common.Result;
import com.zhwy.mapper.ScmmMapper;
import com.zhwy.pojo.SurfChnMulMin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;

/**
 * @author xjz_2002
 * @version 1.0
 */
@Service
public class ScmmService {

    @Resource
    ScmmMapper scmmMapper;

    // 根据时间段和站号获取天气参数
    public List<SurfChnMulMin> getScmmByDateAndStaId(String times, String staId) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime endTimeDate = LocalDateTime.parse(times, dtf);
        LocalDateTime startTimeDate = endTimeDate.minusHours(1);
        String endTime = endTimeDate.format(dtf);
        String startTime = startTimeDate.format(dtf);
        return scmmMapper.getScmmList(startTime,endTime,staId);
    }

    //根据站号获取DB中最新时间
    public String getScmmNewDate(String staId){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date scmmNewDate = scmmMapper.getScmmNewDate(staId);
        return sdf.format(scmmNewDate);
    }


}

Controller层 ScmmController.java

package com.zhwy.controller;

import com.zhwy.common.DataType;
import com.zhwy.common.Result;
import com.zhwy.pojo.SurfChnMulMin;
import com.zhwy.service.ScmmService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author xjz_2002
 * @version 1.0
 */
@RestController
public class ScmmController {

    @Resource
    ScmmService scmmService;

    // 根据时间段和站号获取天气参数
    @RequestMapping(value = "/getScmmByDateAndStaIdEnum")
    public Result getScmmByDateAndStaId(String staId) {

        //获取数据库中最新日期时间
        String times = scmmService.getScmmNewDate(staId);

        //根据站号查询DB中近一小时所有数据
        List<SurfChnMulMin> scmmList = scmmService.getScmmByDateAndStaId(times, staId);

        //对返回结果进行格式处理
        Map<String, List<Map<String, String>>> resultMap = new HashMap<>();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        for (DataType dataType : DataType.values()) {

            //dataList存放近一小时数据,根据天气参数返回该参数的值和日期时间
            List<Map<String, String>> dataList = new ArrayList<>();

            //遍历近一小时所有数据,进行处理
            for (SurfChnMulMin scmm : scmmList) {
                Map<String, String> dataMap = new HashMap<>();
                dataMap.put("datetime", sdf.format(scmm.getDatetime()));
                dataType.populateData(dataMap, scmm);
                dataList.add(dataMap);
            }

            resultMap.put(dataType.name().toLowerCase(), dataList);
        }

        return Result.ok(resultMap);
    }
}

application.yml 配置文件

image-20240129221751308

效果截图:

image-20240128185915764

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

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

相关文章

Java基于SpringBoot+Vue的网上超市管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Linux的bash命令语法

可用点 #!/bin/bash # 文件要以上面开始,.sh结尾的文件不需要# 赋权文件可执行权限 chmod x <fileName># 获取java jar包启动的进程id ps -ef | grep *.jar | grep -v grep | awk {print $2}shell变量 变量命令规则&#xff1a; 只能包含字母、数字、下划线&#xff1…

jsjiami.v6加解密教学

1. 优点 a. 安全性提升 JavaScript 加密可以有效保护源代码&#xff0c;减少恶意用户的攻击风险。 b. 代码混淆 通过混淆技术&#xff0c;可以使代码变得难以阅读和理解&#xff0c;增加破解的难度。 c. 知识产权保护 对于商业项目&#xff0c;JavaScript 加密有助于保护…

GLOBALCHIP GC3909Pin to Pin兼容A3909/allegro电机驱动芯片产品参数分析,应用于摇头机,舞台灯,打印机,白色家电等

GLOBALCHIP GC3909 12V H 桥驱动器芯片替代A3909/Allegro产品概述: GC3909是一款双通道12V直流电机驱动芯片&#xff0c;为摄像机、消费类产品、玩具和其他低压或者电池供电的运动控制类应用提供了集成的电机驱动解决方案。芯片一般用来驱动两个直流电机或者驱动一个步进电机。…

RX-8571SA/NB/LC实时时钟模块规格书

. 内置 32.768 kHz 晶体单元(频率精度调整完毕) .接口类型&#xff1a;I2C-Bus 接口 (400 kHz) .工作电压范围&#xff1a;1.6 V ~ 5.5 V .计时&#xff08;保持&#xff09; 电压范围&#xff1a;1.3 V ~ 5.5 V .低待机电流&#xff1a;220 nA (Typ.) / 3 V .32.768 k…

pod部署prometheus

1、部署node-exporter 2、收集节点信息 curl -Ls http://20.0.0.17:9100/metrics | grep node_cpu_seconds curl -Ls http://20.0.0.37:9100/metrics | grep node_cpu_seconds curl -Ls http://20.0.0.47:9100/metrics | grep node_cpu_seconds 3、创建账号&#xff0c;管理…

【基础算法】1、快速排序快速选择

快速排序思想&#xff1a; 1、找一个分界点。 2、在分界点两边开始调整范围。 3、递归两边&#xff0c;重复。 例题&#xff1a; 给定你一个长度为 n的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xf…

【软考问题】-- 5 - 知识精讲 - 项目进度管理

一、基本问题 项目进度管理&#xff08;按时完成&#xff09; 1&#xff1a;紧前关系绘图法&#xff1f; 定义&#xff1a;它是创建进度模型的一种技术。别称&#xff1a; PDM、前导图法、单代号网络图&#xff08;只有节点需要编号&#xff09;、活动节点图&#xff08;AON&a…

自动化测试系列 —— UI自动化测试!

UI 测试是一种测试类型&#xff0c;也称为用户界面测试&#xff0c;通过该测试&#xff0c;我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG。了解用户将如何在用户和网站之间进行交互以执行 UI 测试至关重要&#xff0c;通过执行 UI 测试…

git push后,如何撤销git log上的错误注释

修改了本地的代码&#xff0c;执行了下面的操作&#xff0c;提交之后&#xff0c;怎么样修改 git add ********(文件名)//git add 添加修改文件名之后 git commit //git commit 在当前分支提交&#xff0c;编写提交注释 git push //git push 提交修…

基于视觉的移载协作机器人机床上下料末端纠偏算法

摘 要 针对复合机器人在机床上下料中的定位方法,本文主要关注识别机床卡盘和末端作业面的定位。首先分 析了复合机器人在机床上下料过程中的工作原理及其基本结构,包括 AGV (自动导引车)和协作机器人 的功能及特点。然后,详细阐述了如何使用视觉系统和纠偏算法来…

合合信息TextIn服务使用心得

目录 一、前言二、TextIn简介2.1、通用文字识别2.2、国内通用票据识别2.3、通用表格识别 三、项目案例3.1、application.yml3.2、TextInService3.3、TextInController3.4、测试 四、总结 一、前言 智能图像处理、文字表格识别、文档内容提取产品的背景源自于人工智能技术的快速…

自动化测试的10大误区!

自动化测试因提高效率&#xff0c;减少重复工作的特性而被广泛采用。然而&#xff0c;随着自动化测试的普及&#xff0c;自动化测试也面临一系列挑战和误解。 这些误区不仅影响了测试的有效性&#xff0c;还会导致一定的项目风险&#xff0c;为了确保自动化测试能够真正提升测…

YOLOv8改进 | 可视化热力图 | 支持YOLOv8最新版本密度热力图,和视频热力图

一、本文介绍 本文给大家带来的机制是集成了YOLOv8最新版本的可视化热力图功能,热力图作为我们论文当中的必备一环,可以展示出我们呈现机制的有效性,本文的内容支持YOLOv8最新版本的根据密度呈现的热力图,同时支持视频检测,根据视频中的密度来绘画热力图。 在开始之前给…

方案:将vue项目放在SpringMVC中,并用tomcat访问

需要先将项目生成一次war包才能访问项目的webapp文件夹下的资源&#xff0c;否则tomcat的webapp文件夹下面不会生成对应资源文件夹就无法访问。 问题&#xff1a;目录如下&#xff1a; 今天我测试了一下将vue打包后&#xff0c;放入webapp下面访问&#xff0c;却发现vue项目无…

基于C#制作一个连连看小游戏

基于C#制作一个连连看小游戏,实现:难易度选择、关卡选择、倒计时进度条、得分计算、音效播放等功能。 目录 引言游戏规则开发环境准备游戏界面设计游戏逻辑实现图片加载与显示鼠标事件处理游戏优化与扩展添加关卡与难度选择说明</

C++ ffmpeg RTSP 视频推流实现, arm linux平台

环境&#xff1a; FFmpeg版本&#xff1a;n4.2.2 下载地址&#xff08;下载编译后请确认版本正确&#xff09;&#xff1a; https://ffmpeg.org//download.html 下面地址经过第三方git加速可能存在实效性&#xff1a; https://hub.fgit.cf/FFmpeg/FFmpeg/tree/n4.4.2实现代码…

MicroPython核心:映射和字典

MicroPython字典和映射使用称为开放寻址和线性探测的技术&#xff0c;本文详细介绍了这两种方法。 开放寻址 开放寻址用于解决碰撞问题&#xff0c;碰撞是非常常见的现象&#xff0c;当两个条目恰好散列到同一个槽或位置时就会发生碰撞。例如&#xff0c;散列设置如下&#x…

【教程】极简Docker搭建“帕鲁幻兽PalWorld”服务器, 附资源

注意&#xff1a; 如果搭建在个人服务器或者内网中&#xff0c;需要做内网穿透&#xff0c;可以看这篇博客&#xff1a; 【教程】超详细安装和使用免费内网穿透软件Zerotier-One-CSDN博客文章浏览阅读523次&#xff0c;点赞8次&#xff0c;收藏8次。真的很详细https://blog.csd…

14个国产AI大模型备案获批,众多科技巨头进入AIGC赛道

北京商报官网消息&#xff0c;第四范式、什么值得买、新壹科技、衔远科技、小米、智联招聘、Boss直聘、脉脉等13家企业的&#xff0c;14个国产AI大模型通过《生成式人工智能服务管理暂行办法》备案&#xff0c;可实现商业化应用。 自2023年8月&#xff0c;文心一言、讯飞星火、…