基于m-p条件查询代码生成

news2025/1/16 13:41:02

目录

起因

演示

使用

0.自定义注解

1.定义一个dto的条件查询类

 2.调用主程序

 效果图

小结

代码

注解

Dto类

完整代码

起因

最近两天一直写后台管理统计的增删改查(很少写增删改查,所以不是很熟练),几乎每个表都要涉及到条件查询的业务,写了两三个条件查询之后发觉到模式还是比较固定的,所以就有了写基于mybatis-plus条件查询代码生成的念头。

高级的我不会用,也不需要,就简单的造个自己能用的轮子,把代码输出到控制台就好了,在经过一个半小时之后……

演示

使用

0.自定义注解

 简要说明:

在字段标注Entity表明是映射实体

在字段标注Eq表明是条件查询的相等

在字段标注Ge表明是条件查询的大于等于,Le是小于等于,这两个注解都有一个column的属性,默认是create_time,表示对哪一列的大于等于或者小于等于

在字段标注Like注解就是模糊查询的字段

说明:就写了个临时的demo,所以注解没定义完全。根据这个思路是可以补全注解的。demo中字段名必须是数据库字段的驼峰形式。

1.定义一个dto的条件查询类

这里我用到了分页

@Data
@EqualsAndHashCode(callSuper = true)
public class OrderConditionPageDto extends PageDto {

    @Eq
    private Integer userId;

    private Integer companyId;

    @Like
    private String username;

    private Integer status;

    private Integer productId;

    private String productName;

    private Long tokenId;

    @Ge(column = "create_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date startTime;

    @Le(column = "create_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date endTime;

    @Entity
    private Order order; // 分页的实体
}

 2.调用主程序

    public static void main(String[] args){
        annList.add(Eq.class.getName());
        annList.add(Ge.class.getName());
        annList.add(Le.class.getName());
        annList.add(Like.class.getName());

        printCode(OrderConditionPageDto.class);

    }

 效果图

小结

主要用到了反射,然后特殊情况再特殊处理一下。代码写的很仓促,很多地方都是重复的是为了给代码结构分段,提供个思路 供大家参考完善或修改使用。有错误请指出。

代码

注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Entity {
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Eq {
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Ge {
    String column() default "create_time";
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Le {
    String column() default "create_time";
}

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Like {
}

Dto类

上边给过了

完整代码

仅供参考


/**
 * @author liutong
 * @date 
 */
public class GenerateMain {
    
    public static List<String> annList = new ArrayList<>();
    public static String entityClassName;


    public static void main(String[] args){
        annList.add(Eq.class.getName());
        annList.add(Ge.class.getName());
        annList.add(Le.class.getName());
        annList.add(Like.class.getName());

        printCode(OrderConditionPageDto.class);

    }

    private static void printCode(Class<?> dto) {
        Field[] declaredFields = dto.getDeclaredFields();
        // 拿到映射实体类名
        entityClassName = getEntity(declaredFields);
        // 打印方法名 一行
        head(dto.getName().substring(dto.getName().lastIndexOf('.')+1));
        // 代码Part1
        structure1(declaredFields);
        // 代码Part2
        structure2(declaredFields);
        // 代码Part3
        structure3(declaredFields);
        // 打印一个括号
        tail();
    }

    private static String getEntity(Field[] declaredFields) {
        for (Field field : declaredFields){
            if (field.getAnnotation(Entity.class)!=null){
                return field.getType().getName();
            }
        }
        return "none";
    }

    private static void structure3(Field[] declaredFields) {
        System.out.println("        pageByParam = pageByParam == null ? PageUtil.getDefault() : pageByParam;");
        System.out.println("        QueryWrapper<"+entityClassName+"> queryWrapper = new QueryWrapper<>();");
        for (Field field : declaredFields){
            String name = field.getName();
            Annotation[] annotations = field.getAnnotations();
            for (Annotation annotation : annotations){
                deal(field,name,annotation,3,null);
            }
        }
        System.out.println("        Page<"+entityClassName+"> page = this.page(pageByParam, queryWrapper);");
        System.out.println("        return PageUtil.res(page);");
    }

    private static void structure2(Field[] declaredFields) {
        System.out.println("        if (!ObjectUtils.isEmpty(dto)){");
        for (Field field : declaredFields){
            String name = field.getName();
            Annotation[] annotations = field.getAnnotations();
            for (Annotation annotation : annotations){
                deal(field,name,annotation,2,null);
            }
        }
        System.out.println("            pageByParam = PageUtil.getPageByParam(dto);");
        System.out.println("        }");

    }

    /** 
     * 首字母大写
     * @author liutong
     * @date 2023/3/4 18:34
     * @param name 
     * @return java.lang.String
     */
    public static String captureName(String name) {
        name = name.substring(0, 1).toUpperCase() + name.substring(1);
        return  name;
    }

    private static void structure1(Field[] declaredFields) {
        for (Field field : declaredFields){
            String name = field.getName();
            Class<?> type = field.getType();
            Annotation[] annotations = field.getAnnotations();
            for (Annotation annotation : annotations){
                deal(field,name,annotation,1,type);
            }
        }
        System.out.println("        Page<"+entityClassName+"> pageByParam = null;");
    }

    private static void tail() {
        System.out.println("    }");
    }

    private static void head(String dtoName) {
        System.out.println("    public BasePageVo<"+entityClassName+"> getByCondition("+dtoName+" dto) {");
    }

    private static void deal(Field field, String name, Annotation annotation,Integer type,Class clzss) {
        for (int i1 = 0; i1 < annList.size(); i1++) {
            String s = annList.get(i1);
            boolean equals = annotation.annotationType().getName().equals(s);
            if (equals){
                if (type==3){
                    try {
                        doDeal(field,name,s.substring(s.lastIndexOf('.')).toLowerCase());
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    }
                }
                if (type==2){
                    System.out.println("            "+name+" = dto.get"+captureName(name)+"();");
                }
                if (type==1){
                    System.out.println("        "+clzss.getName()+" "+name+" = "+"null;");
                }
            }
        }
    }

    private static void doDeal(Field field,String name, String s) throws NoSuchFieldException {
        if (s.equals(".ge")){
            Ge annotation = field.getAnnotation(Ge.class);
            String column = annotation.column();
            System.out.println("        queryWrapper = "+name+" == null ? queryWrapper : queryWrapper"+s+"(\""+column+"\","+name+");");
        }
        else if (s.equals(".le")){
            Le annotation = field.getAnnotation(Le.class);
            String column = annotation.column();
            System.out.println("        queryWrapper = "+name+" == null ? queryWrapper : queryWrapper"+s+"(\""+column+"\","+name+");");
        }else {
            System.out.println("        queryWrapper = "+name+" == null ? queryWrapper : queryWrapper"+s+"(\""+humpToUnderline(name)+"\","+name+");");
        }
    }
    /** 
     * 驼峰转下划线
     * @author liutong
     * @date 2023/3/4 18:35
     * @param str 
     * @return java.lang.String
     */
    public static String humpToUnderline(String str) {
        String regex = "([A-Z])";
        Matcher matcher = Pattern.compile(regex).matcher(str);
        while (matcher.find()) {
            String target = matcher.group();
            str = str.replaceAll(target, "_"+target.toLowerCase());
        }
        return str;
    }
}

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

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

相关文章

7个常用的原生JS数组方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 7个常用的原生JS数组方法一、Array.map()二、Array.filter三、Array.reduce四、Array.forEach五、Array.find六、Array.every七、Array.some总结一、Array.map() 作用&#…

Transformer 模型:入门详解(1)

动动发财的小手&#xff0c;点个赞吧&#xff01; 简介 众所周知&#xff0c;transformer 架构是自然语言处理 (NLP) 领域的一项突破。它克服了 seq-to-seq 模型&#xff08;如 RNN 等&#xff09;无法捕获文本中的长期依赖性的局限性。事实证明&#xff0c;transformer 架构是…

【数据结构初阶】详解“树”

目录 前言 1.树概念及结构 &#xff08;1&#xff09;树的概念 &#xff08;2&#xff09;树的名词介绍 &#xff08;3&#xff09;树的表示 ​编辑 2.二叉树概念及结构 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特殊的二叉树 &#xff08;3&#xff0…

sizeof与strlen练习

前言 本篇仅仅是为了更加了解sizeof操作符和strlen函数练习. 对于多条sizeof操作符和strlen函数出现,可能很容易造成头脑不清晰,做题时容易混乱. 目录前言一维数组字符数组情况1:情况2情况3二维数组练习之前请牢记下面这段话.这将是头脑清晰地关键. 提示: sizeof(数组名)&#…

MyBatis高频面试专题

一、介绍下MyBatis中的工作原理 1。介绍MyBatis的基本情况&#xff1a;ORM 2。原理&#xff1a; MyBatis框架的初始化操作处理SQL请求的流程 1.系统启动的时候会加载解析全局配置文件和对应映射文件。加载解析的相关信息存储在 Configuration 对象 Testpublic void test1(…

【ID:17】【20分】A. DS顺序表--类实现

时间限制1秒内存限制128兆字节题目描述用C语言和类实现顺序表属性包括&#xff1a;数组、实际长度、最大长度&#xff08;设定为1000&#xff09;操作包括&#xff1a;创建、插入、删除、查找类定义参考输入第1行先输入n表示有n个数据&#xff0c;即n是实际长度;接着输入n个数据…

HCIE-Cloud Computing LAB备考第二步:逐题攻破--第三题:迁移

迁移 题目 将一台AD服务器迁移到FusionCompute平台,并保障业务正常。 思维导图 markmap内容1 文字介绍 准备Rainbow服务器:在Windows系统安装Rainbow,必须保证其与源端主机、目的端平台互通。关闭防火墙。【首次登录rainbow时,需要注册用户名和密码,考试时根据考题要…

989. 数组形式的整数加法

989. 数组形式的整数加法https://leetcode.cn/problems/add-to-array-form-of-integer/ 难度简单226 整数的 数组形式 num 是按照从左到右的顺序表示其数字的数组。 例如&#xff0c;对于 num 1321 &#xff0c;数组形式是 [1,3,2,1] 。 给定 num &#xff0c;整数的 数组…

【Linux】进程等待 | 详解 wait/waitpid 的 status 参数

&#x1f923; 爆笑教程 &#x1f449; 《看表情包学Linux》&#x1f448; 猛戳订阅 &#x1f525; &#x1f4ad; 写在前面&#xff1a;在上一章中我们讲解了进程创建与进程终止&#xff0c;本章我们开始讲解进程等待。进程等待这部分知识相较于前面还是较为复杂的&#xff0…

Vue2的生命周期(详解)

Vue的生命周期一、生命周期的概念二、钩子函数三、Vue2的生命周期3.1 初始化阶段3.2 挂载阶段3.3 更新阶段3.4 销毁阶段一、生命周期的概念 Vue实例的生命周期: 从创建到销毁的整个过程 二、钩子函数 Vue框架内置函数,随着组件的生命周期阶段,自动执行 作用:特定的时间点,执行特…

Unity Lighting -- 向场景中添加光源

本节笔记来实践向场景中添加光源。 除了平行光源外&#xff0c;还有两种常用的光源&#xff1a; 点光源&#xff08;Point Lights&#xff09;&#xff1a;点光源所发出的光是朝四面八方发散的&#xff0c;我们可以用点光源来模拟灯泡之类的发光物体。 聚光灯源&#xff08;Spo…

python每日学9 : windows上配置gitee的远程仓库,git的初步使用

在开发中&#xff0c;如果遇到复杂的项目&#xff0c;使用版本控制是非常有必要的&#xff0c;如果涉及到多端开发&#xff0c;那么还需要使用远程仓库。本文作个简单记录&#xff0c;记录下git初步使用。 1 下载与安装 git还有几个ui版本&#xff0c;但是开始使用的话&#…

【LeetCode】带环链表两道题

第一题&#xff1a;环形链表 问题介绍 给你一个链表的头节点head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪next指针再次到达&#xff0c;则链表中存在环。为了表示给定链表中的环&#xff0c;评测系统内部使用整数pos 来表示链表…

【Storm】【三】Storm 核心概念详解

Storm 核心概念详解 一、Storm核心概念1.1 Topologies&#xff08;拓扑&#xff09;1.2 Streams&#xff08;流&#xff09;1.3 Spouts1.4 Bolts1.5 Stream groupings&#xff08;分组策略&#xff09;二、Storm架构详解2.1 nimbus进程2.2 supervisor进程2.3 zookeeper的作用2.…

【蒸滴C】C语言结构体入门?看这一篇就够了

目录 一、结构体的定义 二、结构的声明 例子 三、 结构成员的类型 结构体变量的定义和初始化 1.声明类型的同时定义变量p1 2.直接定义结构体变量p2 3.初始化&#xff1a;定义变量的同时赋初值。 4.结构体变量的定义放在结构体的声明之后 5.结构体嵌套初始化 6.结构体…

24节气-惊蛰 // 诗句、海报分享,春风至,惊雷动。

惊蛰&#xff0c;古称"启蛰"&#xff0c;是二十四节气中的第3个节气&#xff0c;更是干支历卯月的起始;时间点在公历3月5-6日之间&#xff0c;太阳到达黄经345时。《月令七十二候集解》:"二月节……万物出乎震&#xff0c;震为雷&#xff0c;故曰惊蛰&#xff0…

【ONE·C || 动态内存管理】

总言 C语言&#xff1a;动态内存管理介绍。 文章目录总言1、为什么存在动态内存管理2、动态内存函数介绍2.1、malloc、free2.1.1、malloc函数2.1.2、free函数2.2、calloc、realloc2.2.1、calloc函数2.2.2、realloc函数3、常见的动态内存错误3.1、对NULL指针的解引用操作3.2、对…

TEX:显示文本

文章目录字体选择字体fontspec宏包根据字体形状控制字体为不同的字体形状选择不同的特征为不同的字体大小状选择不同的特征中文字体选择xeCJK宏包字体选择与设置XELATEX字体名查找字体集与符号居中与缩进居中单边调整两边缩进诗歌缩进列表itemize样例enumerate样例description样…

Java多线程(三)——线程池及定时器

线程池就是一个可以复用线程的技术。前面三种多线程方法就是在用户发起一个线程请求就创建一个新线程来处理&#xff0c;下次新任务来了又要创建新线程&#xff0c;而创建新线程的开销是很大的&#xff0c;这样会严重影响系统的性能。线程池就相当于预先创建好几个线程&#xf…

concrt140.dll丢失四种方法解决丨提示游戏里找不到concrt140.dll?

电脑提示concrt140.dll文件丢失怎么办&#xff1f;由于找不到concrt140.dll&#xff0c;无法继续执行代码&#xff1f; 我们平时在打开 Adobe 应用程序、Halo、Forza Horizon 5 地平线5 等时&#xff0c;可能会遇到找不到 concrt140.dll。因此&#xff0c;这不是特定于某个应用…