SpringBoot+SqlServer查询接口

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

双非本科准备秋招(9.2)——力扣哈希

1、383. 赎金信 跟昨天的题大同小异&#xff0c;因为只有26个字母&#xff0c;所以可以建个有26个坑位的数组。 做完昨天的题目&#xff0c;这个题没啥新意。 class Solution {public boolean canConstruct(String ransomNote, String magazine) {int[] hashTable new int[…

语言模型大战:GPT、Bard与文心一言,谁才是王者?

如何对GPT-3.5、GPT-4、Bard、文心一言、通义千问的水平进行排序&#xff1f; 在聊技术原理之前我们来先看看几个产品的团队背景 一、团队背景 1.1、ChatGPT ChatGPT团队的成员大多具有计算机科学、人工智能、自然语言处理、机器学习等相关领域的高等教育背景&#xff0c;有…

十分钟发布自己的NFT

概述 本文将以一个例子来说明如何在opensea快速发布自己的NFT智能合约&#xff08;ERC721&#xff09;。本着DRY&#xff08;Dont Repeat Yourself&#xff09;原则&#xff0c;我们需要站在巨人的肩膀上来搭建自己的应用&#xff0c;使用经过社区审计和实践检验的代码可以有效…

【Netty技术专题】「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析

零拷贝Zero-Copy 我们先来看下它的定义&#xff1a; “Zero-copy” describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is frequently used to save CPU cycles and memory bandwidth when t…

Cubase 13.0下载安装教程,附安装包和工具,轻松解决安装问题

前言 Cubase是一款专业级的高级音乐创作软件&#xff0c;凭借其无与伦比的灵活工具&#xff0c;您可以快速和直观地创造任何类型的音&#xff0c;充满了各种各样的虚拟仪器、效果和数干种声音。 准备工作 1、Win7及以上系统 2、提前准备好 Cubase 13.0 安装包 没有的可以参…

Kafka高级_生产者ACk机制数据一致性问题

Kafka高级_生产者ACk机制&数据一致性问题 目录需求&#xff1a; 设计思路实现思路分析1.Kafka高级_生产者ACk机制2.Kafka高级数据一致性问题 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c…

基于51单片机天大的滚动显示Protues仿真设计

一、设计背景 数码管是一种常见的数字显示设备&#xff0c;它主要由发光二极管&#xff08;LED&#xff09;和控制电路组成。LED数码管可以分为共阳&#xff08;公共阳极&#xff09;和共阴&#xff08;公共阴极&#xff09;两种类型。在共阳数码管中&#xff0c;每个数码管的阳…

【性能测试】常见适用场景以及策略

面对日益复杂的业务场景和不同的系统架构&#xff0c;前期的需求分析和准备工作&#xff0c;需要耗费很多的时间。而不同的测试策略&#xff0c;也对我们的测试结果是否符合预期目标至关重要。 这篇博客&#xff0c;聊聊我个人对常见的性能测试策略的理解&#xff0c;以及它们…

RabbitMQ中死信交换机的应用,工作原理,实现案例

目录 一、介绍 1. 概述 2. 应用场景 3. 工作原理 二、应用 1. 讲述 2. 运用 三、案例 1. 实践 2. 代码整合 每篇一获 一、介绍 1. 概述 死信交换机是用来处理消息队列中无法被消费者正确处理的消息的交换机。当消息在队列中变成死信时&#xff0c;它会被重新发送…

指针的深入理解(一)

这一节主要复习数组指针&#xff0c;int (* )[ ] 就是数组指针类型的标志。 因为有&#xff08;&#xff09;将*括起来&#xff0c;所以&#xff08;*&#xff09;表示一个指针。[ ] 表示数组&#xff0c;所以&#xff08;*&#xff09;[ ]就表示一个指向数组的指针&#xff…

Day02-课后练习2-参考答案(数据类型和运算符)

文章目录 巩固题1、案例&#xff1a;今天是周2&#xff0c;100天以后是周几&#xff1f;2、案例&#xff1a;求三个整数x,y,z中的最大值3、案例&#xff1a;判断今年是否是闰年4、分析如下代码的计算结果5、分析如下代码的计算结果6、分析如下代码的计算结果7、分析如下代码的计…

STM32以太网接口的配置和使用方法详解

STM32 微控制器提供了多种系列和型号&#xff0c;不同型号的芯片可能有不同的以太网接口&#xff0c;包括MAC&#xff08;媒体访问控制器&#xff09;和PHY&#xff08;物理层接口&#xff09;等组件。在这里&#xff0c;我们以STM32F4系列为例来详细介绍以太网接口的配置和使用…

【精品教程】如何查看iOS崩溃日志

简介 当一个应用程序崩溃&#xff0c;会产生一个崩溃报告&#xff08;crash report&#xff09;&#xff0c;并存储到设备中。崩溃报告描述了应用程序崩溃的条件&#xff0c;通常包含每个执行线程的完整回溯。查看崩溃报告可以帮助我们了解应用程序的崩溃情况&#xff0c;并尝…

大数据学习之Redis、从零基础到入门(三)

目录 三、redis10大数据类型 1.哪十个&#xff1f; 1.1 redis字符串&#xff08;String&#xff09; 1.2 redis列表&#xff08;List&#xff09; 1.3 redis哈希表&#xff08;Hash&#xff09; 1.4 redis集合&#xff08;Set&#xff09; 1.5 redis有序集合&#xff08…

幻兽帕鲁越玩越卡,内存溢出问题如何解决?

近期幻兽帕鲁游戏大火&#xff0c;在联机组队快乐游玩的同时&#xff0c;玩家们也发现了一些小问题。由于游戏有随机掉落材料的设定&#xff0c;服务器在加载掉落物的过程中很容易会出现掉帧、卡顿的情况。某些玩家甚至在游戏1&#xff5e;2时后就出现服务器崩溃的情况&#xf…

dvwa,xss反射型lowmedium

xss&#xff0c;反射型&#xff0c;low&&medium low发现xss本地搭建实操 medium作为初学者的我第一次接触比较浅的绕过思路 low 发现xss 本关无过滤 <script>alert(/xss/)</script> //或 <script>confirm(/xss/)</script> //或 <script&…

解锁潜在价值:服装定制小程序在提升用户忠诚度上的作用

随着科技的不断进步和消费者日益追求个性化的需求&#xff0c;服装定制已成为时尚界的新宠。而在这个快节奏的时代&#xff0c;小程序作为一个方便、实用的工具&#xff0c;为服装品牌打造个性化定制的平台提供了新的可能性。通过利用小程序&#xff0c;服装品牌可以轻松地与消…

使用 FHEW-like 自举 BV-like

参考文献&#xff1a; [CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion between (ring) LWE ciphertexts[C]//International Conference on Applied Cryptography and Network Security. Cham: Springer International Publishing, 2021: 460-479.[K…

关于类加载器的双亲委派机制

什么是双亲委派机制 双亲委派机制指的是&#xff1a;当一个类加载器接收到加载类的任务时&#xff0c;会自底向上的去检查这个类是不是被加载过&#xff0c;如果没有加载过再自上到下进行加载。 如果在向上检查是否加载过的过程中发现已经加载过&#xff0c;那么直接返回这个C…

【git】git update-index --assume-unchanged(不改动.gitignore实现忽略文件)

文章目录 原因分析&#xff1a;添加忽略文件(取消跟踪)的命令&#xff1a;取消忽略文件(恢复跟踪)的命令&#xff1a;查看已经添加了忽略文件(取消跟踪)的命令&#xff1a; 原因分析&#xff1a; 已经维护的项目&#xff0c;文件已经被追踪&#xff0c;gitignore文件不方便修…