项目技巧三

news2024/9/22 7:26:36

目录

我们现在要实现一个接口功能

1.我们先书写sql语句

 2.编写接口

3.书写业务逻辑

4.书写mapper

结果:

缺点:没有根据涨跌幅区间的大小来排序 

1.yml文件

 2.在value object包下映射这个yml文件

3.开启这个配置类进行映射,并把它交给spring管理

4.修改后的业务逻辑

5.新的结果

6.第二种业务逻辑,使用lambda表达式


我们现在要实现一个接口功能

查询当前时间下股票的涨跌幅度区间统计功能
 如果当前日期不在有效时间内,则以最近的一个股票交易时间作为查询点

股票涨跌幅区间定义: "<-7%" 、 "-7~-5%"、 "-5~-3%" 、 "-3~0%" 、"0~3%" 、 "3~5%" 、 "5~7%" 、 ">7%" 

要返回的数据

{
    "code": 1,
    "data": {
        "time": "2021-12-31 14:58:00",
        "infos": [
            {
                "count": 17,
                "title": "-3~0%"
            },
            {
                "count": 2,
                "title": "-5~-3%"
            },
			//省略......
        ]
    }
}

1.我们先书写sql语句

#统计当前时间下(精确到分钟),A股在各个涨跌区间股票的数量;
#股票涨跌幅区间定义: "<-7%" 、 "-7~-5%"、 "-5~-3%" 、 "-3~0%" 、"0~3%" 、 "3~5%" 、 "5~7%" 、 ">7%"

#1.使用的表stock_market_index_info
#2.业务分析:1.时间:当前最新交易时间点
        #2.要统计出每个个股的涨幅流水表
        #3.把每个个股的涨幅转换成涨跌幅区间  使用 case when then end
        #4.最后根据涨跌幅区间来分组统计每个组的记录数量 count
#3.返回的数据 count title(涨跌幅区间)
#1.统计每个个股的涨幅
select (cur_price-pre_close_price)/pre_close_price as ud from stock_rt_info where cur_time='2022-01-06 09:55:00';

 

#2.把涨幅字段的值转换成涨跌幅区间
select
    case
        when tmp.ud>0.07 then '>7%'  #根据条件来该字段的值
        when tmp.ud<=0.07 and tmp.ud>0.05 then '5~7%'
        when tmp.ud<=0.05 and tmp.ud>0.03 then '3~5%'
        when tmp.ud<=0.03 and tmp.ud>0 then '0~3%'
        when tmp.ud<=0 and tmp.ud>-0.03 then '-3~0%'
        when tmp.ud<=-0.03 and tmp.ud>-0.05 then '-5~-3%'
        when tmp.ud<=-0.05 and tmp.ud>=-0.07 then '-7~-5%'
        else '<-7%'
    end 'title' #给这个字段重命名
    from (select (cur_price-pre_close_price)/pre_close_price as ud from stock_rt_info where cur_time='2022-01-06 09:55:00')
    as tmp;

 

#3.根据涨跌幅区间进行分组
select count(*) as count, tmp2.title from (select
                 case
                     when tmp.ud>0.07 then '>7%'  #根据条件来该字段的值
                     when tmp.ud<=0.07 and tmp.ud>0.05 then '5~7%'
                     when tmp.ud<=0.05 and tmp.ud>0.03 then '3~5%'
                     when tmp.ud<=0.03 and tmp.ud>0 then '0~3%'
                     when tmp.ud<=0 and tmp.ud>-0.03 then '-3~0%'
                     when tmp.ud<=-0.03 and tmp.ud>-0.05 then '-5~-3%'
                     when tmp.ud<=-0.05 and tmp.ud>=-0.07 then '-7~-5%'
                     else '<-7%'
                     end 'title' #给这个字段重命名
             from (select (cur_price-pre_close_price)/pre_close_price as ud from stock_rt_info where cur_time='2022-01-06 09:55:00')
                      as tmp) as tmp2 group by tmp2.title;

 2.编写接口

    /**
     * 查询当前时间下股票的涨跌幅度区间统计功能
     * 如果当前日期不在有效时间内,则以最近的一个股票交易时间作为查询点
     * @return
     */
  
    @ApiOperation("查询最新交易时间下股票的涨跌幅度区间中各个股票的数量")
    @GetMapping("/stock/updown")
    public R<Map<String,Object>> getStockUpDown(){//这里使用的是Object,因为每个键对应的类型不一样,一个是String,一个是List集合
        return stockService.stockUpDownScopeCount();
    }

3.书写业务逻辑

/**
     * 查询当前时间下股票的涨跌幅度区间统计功能
     * 如果当前日期不在有效时间内,则以最近的一个股票交易时间作为查询点
     * @return
     */
    @Override
    public R<Map<String, Object>> stockUpDownScopeCount() {
        //1.获取当前时间的最新交易点
        DateTime datetime = DateTimeUtil.getLastDate4Stock(DateTime.now());
        Date time=datetime.toDate();
        //设置mock data
        DateTime curDateTime=DateTime.parse("2022-01-06 09:55:00",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        Date curDate = curDateTime.toDate();

        //2.根据mapper接口获取数据
        List<Map> infos=stockRtInfoMapper.getStockUpDownScopeCount(curDate);

        //3.封装数据
        Map<String,Object>data=new HashMap<>();
        data.put("time",curDateTime.toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")));
        data.put("infos",infos);
        //4.返回数据
        return R.ok(data);
    }

4.书写mapper

    /**
     * 查询当前时间下股票的涨跌幅度区间统计功能
     * 如果当前日期不在有效时间内,则以最近的一个股票交易时间作为查询点
     * @return
     */
    List<Map> getStockUpDownScopeCount(@Param("curDate") Date curDate);

5.书写mapperXml文件

<!--    如果在XML中SQL语句遇到大量特殊字符需要转义,比如:< 等,建议使用** sql 语句 **标记,这样特殊字符就不会被解析器解析
所以使用<![CDATA[]]>   -->
    <select id="getStockUpDownScopeCount" resultType="map">
        <![CDATA[
        select count(*) as count, tmp2.title from (select
        case
        when tmp.ud>0.07 then '>7%'
        when tmp.ud<=0.07 and tmp.ud>0.05 then '5~7%'
        when tmp.ud<=0.05 and tmp.ud>0.03 then '3~5%'
        when tmp.ud<=0.03 and tmp.ud>0 then '0~3%'
        when tmp.ud<=0 and tmp.ud>-0.03 then '-3~0%'
        when tmp.ud<=-0.03 and tmp.ud>-0.05 then '-5~-3%'
        when tmp.ud<=-0.05 and tmp.ud>=-0.07 then '-7~-5%'
        else '<-7%'
        end 'title'
        from (select (cur_price-pre_close_price)/pre_close_price as ud from stock_rt_info where cur_time=#{curDate})
        as tmp) as tmp2 group by tmp2.title
        ]]>
    </select>

结果:

缺点:没有根据涨跌幅区间的大小来排序 

我们可以在application-stock.yml文件中自己书写按照大小排序的涨跌幅区间,因为涨跌幅区间不能直接进行大小比较进行排序

1.yml文件

# 配置股票相关的参数
stock:
  upDownRange:
    - "<-7%"
    - "-7~-5%"
    - "-5~-3%"
    - "-3~0%"
    - "0~3%"
    - "3~5%"
    - "5~7%"
    - ">7%"

 2.在value object包下映射这个yml文件

@Data
@ConfigurationProperties(prefix = "stock")//映射yml文件中stock属性的值
//@Component//直接让其交给spring管理,TODO:我们不使用(不让它自己开启),我们让其他要使用该类的子模块来开启
public class StockInfoConfig {

    public List<String>upDownRange;//涨跌幅区间
}

3.开启这个配置类进行映射,并把它交给spring管理

@Configuration
@EnableConfigurationProperties(StockInfoConfig.class)//TODO:在这个子模块开启加载此配置类,并让它映射yml文件中的stock属性的值,再交给spring管理
public class CommonConfig {

}

4.修改后的业务逻辑

    /**
     * 查询当前时间下股票的涨跌幅度区间统计功能
     * 如果当前日期不在有效时间内,则以最近的一个股票交易时间作为查询点
     * @return
     */
    @Override
    public R<Map<String, Object>> stockUpDownScopeCount() {
        //1.获取当前时间的最新交易点
        DateTime datetime = DateTimeUtil.getLastDate4Stock(DateTime.now());
        Date time=datetime.toDate();
        //设置mock data
        DateTime curDateTime=DateTime.parse("2022-01-06 09:55:00",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        Date curDate = curDateTime.toDate();

        //2.根据mapper接口获取数据
        List<Map> infos=stockRtInfoMapper.getStockUpDownScopeCount(curDate);

        //获取涨跌幅区间(按照大小排序)
        List<String> upDownRange = stockInfoConfig.getUpDownRange();

        List<Map>orderInfos=new ArrayList<>();//创建一个新的集合,来接收新的数据

        for (String range : upDownRange) {//按照涨跌幅区间排序(升序)
            Map tmpMap =null;//创建一个临时map
            for (Map map : infos) {
                if(map.containsValue(range)){//如果包含这个涨跌幅区间,就进行赋值
                    tmpMap=map;
                    break;
                }
            }
            if(tmpMap==null) {//如果tmpMap还为null,则说明没有该涨跌幅区间
                tmpMap=new HashMap();//自己进行赋值
                tmpMap.put("count",0);
                tmpMap.put("title",range);
            }
            orderInfos.add(tmpMap);//添加
        }

        //3.封装数据
        Map<String,Object>data=new HashMap<>();
        data.put("time",curDateTime.toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")));
        data.put("infos",orderInfos);
        //4.返回数据
        return R.ok(data);
    }

5.新的结果

6.第二种业务逻辑,使用lambda表达式

    /**
     * 查询当前时间下股票的涨跌幅度区间统计功能
     * 如果当前日期不在有效时间内,则以最近的一个股票交易时间作为查询点
     * @return
     */
    @Override
    public R<Map<String, Object>> stockUpDownScopeCount() {
        //1.获取当前时间的最新交易点
        DateTime datetime = DateTimeUtil.getLastDate4Stock(DateTime.now());
        Date time=datetime.toDate();
        //设置mock data
        DateTime curDateTime=DateTime.parse("2022-01-06 09:55:00",DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
        Date curDate = curDateTime.toDate();

        //2.根据mapper接口获取数据
        List<Map> infos=stockRtInfoMapper.getStockUpDownScopeCount(curDate);

        //获取涨跌幅区间(按照大小排序)
        List<String> upDownRange = stockInfoConfig.getUpDownRange();

/*
        List<Map>orderInfos=new ArrayList<>();//创建一个新的集合,来接收新的数据
        for (String range : upDownRange) {//按照涨跌幅区间排序(升序)
            Map tmpMap =null;//创建一个临时map
            for (Map map : infos) {
                if(map.containsValue(range)){//如果包含这个涨跌幅区间,就进行赋值
                    tmpMap=map;
                    break;
                }
            }
            if(tmpMap==null) {//如果tmpMap还为null,则说明没有该涨跌幅区间
                tmpMap=new HashMap();//自己进行赋值
                tmpMap.put("count",0);
                tmpMap.put("title",range);
            }
            orderInfos.add(tmpMap);//添加
        }
*/
        List<Map>orderInfos=upDownRange.stream().map(range->{//使用map方法将String数据类型转换成map类型,range是upDownRange集合的每个值
            Map tmpMap=null;//创建一个临时map
            //使用之前查询出来的List<Map>集合来过滤出含有涨跌幅区间的map,并使用findFirst()进行赋值
            //这里使用 Optional来接收,是防止为null
            Optional<Map>op =infos.stream().filter(map->map.containsValue(range)).findFirst();
            if(op.isPresent()){
                tmpMap=op.get();//存在就直接进行赋值
            }else{
                tmpMap=new HashMap();//自己进行赋值
                tmpMap.put("count",0);
                tmpMap.put("title",range);
            }
            return tmpMap;
        }).collect(Collectors.toList());

        //3.封装数据
        Map<String,Object>data=new HashMap<>();
        data.put("time",curDateTime.toString(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")));
        data.put("infos",orderInfos);
        //4.返回数据
        return R.ok(data);
    }

 

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

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

相关文章

勒索攻击后快速恢复的八个关键步骤,如何避免被勒索攻击

勒索软件攻击依然是当今企业面临的最大安全威胁之一。根据德迅云安全收集的报告&#xff0c;59%的企业在2023年遭遇了勒索软件攻击&#xff0c;其中56%的受害者最终选择支付赎金以恢复数据。更为严重的是&#xff0c;63%的勒索金额达到或超过了100万美元&#xff0c;平均支付金…

RS232转RS485

1.232转485转换器 232转485转换器是RS-232与RS-485之间的双向接口的转换器&#xff0c;应用于主控机之间&#xff0c;主控机与单片机或外设之间构成点到点&#xff0c;点到多点远程多机通信网络&#xff0c;实现多机应答通信&#xff0c;广泛地应用于工业自动化控制系统&#x…

免费申请aws一年免费服务器使用教程

由于近期要测试一个公网项目&#xff0c;对比之下&#xff0c;选择了aws服务器&#xff0c;免费使用一年。 准备&#xff1a;一个visa信用卡即可&#xff0c;需要一个外网邮箱&#xff08;我这边使用的hotmail&#xff09; 注册的步骤不再赘述&#xff0c;切记几个点&#xff0…

windows 环境下安装OpenCV For Java

windows 环境下安装OpenCV For Java 进入官网下载对应安装包 opencv官网地址&#xff1a; https://opencv.org/releases/ source里面是官方的xml文件&#xff0c;包含人脸识别 windows下载下来是一个exe文件&#xff0c;里面包含项目需要的jar包 执行opencv-4.9.0-windows.ex…

被低估的SQL

SQL是现代数据库管理系统中不可或缺的一部分。尽管它的使用已十分普遍&#xff0c;但在数据处理领域&#xff0c;SQL的某些功能和潜力仍然被许多人低估。接下来&#xff0c;小编将与您一起&#xff0c;探讨SQL的一些被忽视的特性&#xff0c;揭示它在数据管理中的真正实力。 1.…

《深度学习》OpenCV轮廓检测 轮廓近似、模板匹配 解析及实现

一、轮廓近似 1、什么是轮廓近似 指对轮廓进行逼近或拟合&#xff0c;得到近似的轮廓。在图像处理中&#xff0c;轮廓表示了图像中物体的边界&#xff0c;因此轮廓近似可以用来描述和识别物体的形状。 2、参数解析 1&#xff09;用法 import cv2 approx cv2.approxPolyDP(cu…

Java SpringBoot构建助农平台,三步实现高效捐赠,2025届设计新思路!

✍✍计算机毕业编程指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java…

如何应对 Android 面试官 -> 内存如何进行优化?玩转 LeakCanary

前言 本章主要围绕内存相关的知识点讲解&#xff1b; 内存分配 在内存优化中&#xff0c;我们通常需要借助一些常用的 adb 命令&#xff0c;方便我们快速定位&#xff0c;下面是一些常用的 adb 命令总结 常用 adb 命令 adb shell getprop ro.product.model // 手机型号adb s…

HTTP“请求”和“响应”的报头及正文详解

目录 一、请求 "报头" (header) 二、请求 "正文" (body) 2.1 application/x-www-form-urlencoded 2.2 multipart/form-data 2.3 application/json 三、HTTP 响应状态码 四、响应 "报头" (header) 五、响应 "正文" (body) 5.1…

如何设置Word文档部分内容无法编辑?

工作中&#xff0c;我们可能会在word中制作一些请柬、表格之类的&#xff0c;有些文件内容不想要进行修改&#xff0c;为了防止他人随意修改内容。我们可以设置限制编辑&#xff0c;可以对一部分内容设置限制编辑&#xff0c;具体方法如下&#xff1a; 我们将需要将可以编辑的…

记录 PyQt6 / PySide 6 自定义边框窗口的 Bug 及可能可行的解决方案:窗口抖动和添加 DWM 环绕阴影的大致原理

前言&#xff1a; 本篇文章将要讨论我在前不久发表的关于 PyQt6 / PySide6 自定义边框窗口代码及内容中的问题&#xff1a; &#xff08;终&#xff09;PyQt6 / PySide 6 Pywin32 自定义标题栏窗口 完全还原 Windows 原生窗口边框特效_pyside6 win32 无边框窗口-CSDN博客ht…

【C++11(一)之入门基础)】

文章目录 C简介统一的列表初始化&#xff5b;&#xff5d;初始化 std::initializer_liststd::initializer_list是什么类型&#xff1a;std::initializer_list使用场景&#xff1a; 声明autodecltypenullptr STL中一些变化 C简介 在2003年C标准委员会曾经提交了一份技术勘误表(…

报告 | 以消费者为中心,消费品零售行业数字化建设持续深化

​2024年是“消费促进年”&#xff0c;国内消费市场稳步复苏。在消费需求多样化、国家政策的推动下&#xff0c;“数字化转型”仍是消费品零售行业的年度主题词&#xff0c;是品牌方获取核心竞争力的必要途径。消费品零售行业的数字化转型重心有所调整&#xff0c;从线上渠道布…

ARM架构

一、内存分布结构 栈&#xff1a;局部变量 函数参数 函数返回地址 堆&#xff1a;程序员自己管理的内存区域&#xff0c;使用是需要动态申请&#xff0c;使用捷顺后需要释放 bss&#xff1a; 初始化为0和未初始化的全局及静态变量 data&#xff1a;初始化不为0全局及静态变量…

Opencv中的直方图(4)局部直方图均衡技术函数createCLAHE()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个指向 cv::CLAHE 类的智能指针并初始化它。 函数原型 Ptr<CLAHE> cv::createCLAHE (double clipLimit 40.0,Size tileGridSize…

JavaScript的BOM模型

一、浏览器环境概述(BOM) JavaScript 是浏览器的内置脚本语言&#xff0c;一旦网页内嵌了 JavaScript 脚本&#xff0c;浏览器加载网页&#xff0c;就会去执行脚本&#xff0c;从而达到操作浏览器的目的&#xff0c;实现网页的各种动态效果 二、script 元素工作原理 浏览器加…

网络编程 0903作业

作业 1、将TCP的CS模型再敲一遍 tcpserver.c #include <myhead.h> #define SERPORT 1111 #define SERIP "192.168.58.128" #define BACKLOG 40 int main(int argc, const char *argv[]) {int oldfd socket(AF_INET,SOCK_STREAM,0);//1、产生一个原始套接字…

pikachu文件包含漏洞靶场

File inclusion(local) 创建1.php 步骤一&#xff1a;选择一个球员提交 ../../../../1.php File Inclusion(remote)&#xff08;远程文件包含&#xff09; 步骤一&#xff1a;更改参数 php.ini ⾥有两个重要的参数 allow_url_fopen 、allow_url_include &#xff1b; 步骤二…

玩机进阶教程-----如何通过boot查看当前机型版本号 型号以及启动分区 提升保资料写固件成功率

在玩机过程中我们会遇到一些无法开机进系统的机型。而有需要其中的数据。如果简单的写入固件。可能会由于与当前机型版本不符或者版本差别太大的缘故而导致资料无法保存。如果当前机型有版本仿回滚机制。那么有可能误刷系统也会不开机。那么如何通过简单的操作来查看当前机型的…

GAMES202——作业5 实时光线追踪降噪(联合双边滤波、多帧的投影与积累、À-Trous Wavelet 加速单帧降噪)

任务 1.实现单帧降噪 2.实现多帧投影 3.实现多帧累积 Bonus:使用-Trous Wavelet 加速单帧降噪 实现 单帧降噪 这里实现比较简单&#xff0c;直接根据给出的联合双边滤波核的公式就能实现 Buffer2D<Float3> Denoiser::Filter(const FrameInfo &frameInfo) {int heigh…