首页 > 数据库 >记录一次使用 表达式引擎 自定义注解 还有 sql union all 实现对数据库数据提取、重组、计算的业务 mybatis-plus + SpringBoot

记录一次使用 表达式引擎 自定义注解 还有 sql union all 实现对数据库数据提取、重组、计算的业务 mybatis-plus + SpringBoot

时间:2023-04-20 10:56:46浏览次数:40  
标签:count SpringBoot 自定义 union List value ApiModelProperty private CourseCalc

这样编写减少了前后端很多没必要的遍历,以及if判断并最大限度提高了代码的可变通性
额外需要学习的是ORM框架下,如何接收多表(各表结构不同)操作后,sql返回的新结构的临时表问题

表达式引擎用到的依赖

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-jexl3</artifactId>
            <version>3.1</version>
        </dependency>

超长sql语句

  @Select("\tSELECT address school, classesid class_name, count(id) count, #{e} project from (\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valuemorning1 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valuemorning2 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valuemorning3 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valuemorning4 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valuemorning5 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valueafternoon1 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valueafternoon2 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valueafternoon3 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valueafternoon4 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valueafternoon5 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valueweek1 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valueweek2 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valueweek3 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valueweek4 like CONCAT('%', #{e}, '%') union all\n" +
            "\t\tSELECT * FROM `t_wisdom_course` where valueweek5 like CONCAT('%', #{e}, '%')\n" +
            "\t) a GROUP BY classesid;")
    List<WisdomCourseTypeDto> findAllProject(String e);

自定义注解

/**
 * @Author Lambert
 * @Date 2023/4/20 10:01
 ***/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CourseCalc {
    int count() default 80;
}

DTO类

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class WisdomCourseDto {
    @CourseCalc(count = 80)
    @ApiModelProperty(value = "走平衡木")
    private List<WisdomCourseTypeDto> balanceBeam;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "单脚站")
    private List<WisdomCourseTypeDto> standOnOneLeg;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "脚尖对脚跟倒着走")
    private List<WisdomCourseTypeDto> walkToetoheelBackwards;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "单脚原地跳")
    private List<WisdomCourseTypeDto> jumpOnOneFoot;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "双脚原地左右跳")
    private List<WisdomCourseTypeDto> jumpLeftAndRightWithYourFeetOnTheSpot;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "双脚左右交替跳")
    private List<WisdomCourseTypeDto> hopFromSideToSide;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "立定跳远")
    private List<WisdomCourseTypeDto> standingBroadJump;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "一次性连续蹲起")
    private List<WisdomCourseTypeDto> squatContinuouslyInOneGo;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "蹲起")
    private List<WisdomCourseTypeDto> squat;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "原地侧面投")
    private List<WisdomCourseTypeDto> sideThrowInPlace;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "脚尖对脚跟走")
    private List<WisdomCourseTypeDto> goToeToHeel;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "双脚向前左右跳")
    private List<WisdomCourseTypeDto> jumpLeftAndRightWithYourFeetForward;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "蛙跳")
    private List<WisdomCourseTypeDto> leapfrog;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "脚尖对脚跟走(一)")
    private List<WisdomCourseTypeDto> toeToHeelOne;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "脚尖对脚跟走(二)")
    private List<WisdomCourseTypeDto> toeToHeelTwo;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "原地踏步走")
    private List<WisdomCourseTypeDto> walkinplace;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "走直线")
    private List<WisdomCourseTypeDto> takeTheAirLine;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "走曲线")
    private List<WisdomCourseTypeDto> curve;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "手膝爬")
    private List<WisdomCourseTypeDto> handAndKneeCrawling;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "手足爬")
    private List<WisdomCourseTypeDto> footAndFootCrawling;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "钻爬")
    private List<WisdomCourseTypeDto> method;

    @CourseCalc(count = 80)
    @ApiModelProperty(value = "原地正面投")
    private List<WisdomCourseTypeDto> headInPlace;

    @CourseCalc(count = 32)
    @ApiModelProperty(value = "连续三次跳")
    private List<WisdomCourseTypeDto> threeJumpsInARow;

    @CourseCalc(count = 32)
    @ApiModelProperty(value = "单脚连续跳")
    private List<WisdomCourseTypeDto> hopContinuouslyOnOneFoot;

    @CourseCalc(count = 32)
    @ApiModelProperty(value = "单脚连续向前跳0.5米")
    private List<WisdomCourseTypeDto> jumpForwardOnOneFootInSuccessionMeter;

    @CourseCalc(count = 32)
    @ApiModelProperty(value = "单脚连续向前跳")
    private List<WisdomCourseTypeDto> jumpForwardOnOneFootInSuccession;
}

核心实现

@SpringBootTest
class EducationErverApplicationTests {

    @Autowired
    WisdomCourseTypeMapper wisdomCourseTypeMapper;
    @Autowired
    WisdomCourseMapper wisdomCourseMapper;

    @Test
    void contextLoads() {
        WisdomCourseDto wisdomCourseDto = new WisdomCourseDto();
        //创建表达式引擎
        JexlEngine engine = new Engine();
        JexlContext context = new MapContext();
        Field[] declaredFields = wisdomCourseDto.getClass().getDeclaredFields();
        for (int i = 0; i < declaredFields.length; i++) {
            char[] chars = declaredFields[i].getName().toCharArray();
            chars[0] = toUpperCase(chars[0]);
            int count = declaredFields[0].getAnnotation(CourseCalc.class).count();
            String project = declaredFields[0].getAnnotation(ApiModelProperty.class).value();
            List<WisdomCourseTypeDto> t = wisdomCourseMapper.findAllProject(project);
            for (WisdomCourseTypeDto wisdomCourseTypeDto : t) {
                DecimalFormat df = new DecimalFormat("0.00");
                String format = df.format(Float.valueOf(wisdomCourseTypeDto.getCount()) / count * 100) + "%";
                wisdomCourseTypeDto.setCount(format);
            }
            String expressionStr = "wisdomCourseDto.set" + String.valueOf(chars) + "(t)";
            context.set("t", t);
            context.set("wisdomCourseDto", wisdomCourseDto);
            JexlExpression expression = engine.createExpression(expressionStr);
            Object o = expression.evaluate(context);
        }
    }

    /**
     * 字符转成大写
     *
     * @param c 需要转化的字符
     */
    public static char toUpperCase(char c) {
        if (97 <= c && c <= 122) {
            c ^= 32;
        }
        return c;
    }
}

标签:count,SpringBoot,自定义,union,List,value,ApiModelProperty,private,CourseCalc
From: https://www.cnblogs.com/lambertlt/p/17335973.html

相关文章

  • Vue3 自定义hook
    视频9.自定义hook函数什么是hook?——本质是一个函数,把setup函数中使用的CompositionAPI进行了封装。类似于vue2.x中的mixin。自定义hook的优势:复用代码,让setup中的逻辑更清楚易懂。componentsDemo.vue<template> <h2>当前求和为:{{sum}}</h2> <button@clic......
  • SpringBoot静态文件映射问题
    如果遇到这种情况,检查静态文件(js/css/img)是不是在默认的static路径下,在查看application配置中的static-path-pattern:是否和前端映射路径完全相同,要是不相同则会造成访问不到......
  • springboot 事件监听@EventListener注解用法
    前言关于@EventListener注解,百度了一下,网上的教程很多都是继承这个,实现那个的,其实根本用不着这么麻烦,所以就写了此文,如文章所讲有误,还请谅解更多详细用法请百度一下~作用关于事件监听,目前我的用法最多的就是记录日志之类的。在此之前我们记录日志一般都是先把日志的service注......
  • 自定义注解+AOP实现参数校验
          转: https://www.cnblogs.com/mcj123/p/16842043.htmlhttps://www.cnblogs.com/fps2tao/p/13921207.html https://www.cnblogs.com/fps2tao/p/13921106.htmlhttps://www.cnblogs.com/fps2tao/p/13306246.html ......
  • 类中自定义函数并调用and使用钩子函数打印类中变量
    在一个类中自定义一个函数A,并在前向传播函数forword中调用这个函数假设您正在编写一个PyTorch模型,您可以按照以下方式在类中定义函数A,并在forward函数中调用它:importtorchimporttorch.nnasnnclassMyModel(nn.Module):def__init__(self):super(MyMod......
  • SpringBoot利用Filter获取请求数据request和修改返回response中的数据
    WrapperedRequestimportjavax.servlet.ReadListener;importjavax.servlet.ServletInputStream;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;importjava.io.*;publicclassWrapperedRequestextendsHttpSe......
  • springboot学习之五(自动配置)
    一、@Conditional源码springboot的自动配置是通过@Conditional注解(条件判断)实现的.@Conditional是Spring4版本新提供的一种注解,它的作用是按照设定的条件进行判断,把满足判断条件的bean注册到Spring容器。packageorg.springframework.context.annotation;importjava.lang.a......
  • 微信小程序开发自定义tabbar
    问题背景自定义tabBar可以让开发者更加灵活地设置tabBar样式,以满足更多个性化的场景。本文将介绍微信小程序开发中如何自定义tabbar。问题分析微信小程序中,自定义tabbar的流程如下:配置信息在app.json中的tabBar项指定custom字段,同时其余tabBar相关配置也补充完整......
  • 物联网多协议、多场景自定义测试|XMeter Cloud 更新
    近日,全球首个物联网MQTT负载测试云服务XMeterCloud推出了自定义场景测试功能。该功能将满足用户自主定义测试场景和测试更广泛协议的需求,实现对除MQTT以外的TCP、WebSocket、HTTP等其他网络协议的测试,帮助用户构建更复杂的测试场景,提高测试效率和测试覆盖率。了解详情:XMet......
  • 创建idea springboot(spring Initializr项目)需要手动导包)
    用注解@RestController 的时候,报错:找不到符号原来是没有import这个包,复制粘贴 @RestController 的时候,idea并没有自动import这个包,导致找不到,要手动import。手动导入就行了。另外,如果是创建的maven项目,由于main类文件的放置位置不同,也会报错:nested exception is java.lang.I......