当前位置: 首页 > news >正文

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

目录

起因

演示

使用

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 {@Eqprivate Integer userId;private Integer companyId;@Likeprivate 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;@Entityprivate 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));// 代码Part1structure1(declaredFields);// 代码Part2structure2(declaredFields);// 代码Part3structure3(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;}
}

相关文章:

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

目录 起因 演示 使用 0.自定义注解 1.定义一个dto的条件查询类 2.调用主程序 效果图 小结 代码 注解 Dto类 完整代码 起因 最近两天一直写后台管理统计的增删改查(很少写增删改查&#xff0c;所以不是很熟练)&#xff0c;几乎每个表都要涉及到条件查询的业务&#xf…...

【LeetCode】带环链表两道题

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

CSS奇思妙想之-利用CSS裁剪(clip-path)完成各种图形

在日常开发当中&#xff0c;如果想要开发多边形&#xff0c;一般都需要多个盒子或者伪元素的帮助&#xff0c;有没有一直办法能只使用一个盒子实现呢&#xff1f; 有的&#xff1a;css裁剪 clip-path介绍 css裁剪&#xff08;clip-path&#xff09;这个属性平时率非常低。但是…...

力扣每日一题刷题总结:哈希表篇

剑指 Offer II 033.变位词组 Medium 哈希表 变位词 2023/3/3 给定一个字符串数组 strs &#xff0c;将 变位词 组合在一起。 可以按任意顺序返回结果列表。 注意&#xff1a;若两个字符串中每个字符出现的次数都相同&#xff0c;则称它们互为变位词。 示例&#xff1a; 示例 1:…...

【Redis】redis大key和大value的危害,如何处理?

前序 还记得上次和同事一起去面试候选人时&#xff0c;同事提了一个问题&#xff1a;Redis的大key有什么危害&#xff1f;当时候选人主要作答的角度是一个key的value较大时的情况&#xff0c;比如&#xff1a; 内存不均&#xff1a;单value较大时&#xff0c;可能会导致节点之…...

Spring Boot:实现MyBatis动态创建表

在有些应用场景中&#xff0c;我们会有需要动态创建和操作表的需求。 比如因为单表数据存储量太大而采取分表存储的情况&#xff0c;又或者是按日期生成日志表存储系统日志等等。这个时候就需要我们动态的生成和操作数据库表了。 而我们都知道&#xff0c;以往我们使用MyBati…...

SpringBoot+Seata在多数据源和feign中的简单使用

SpringBootSeata简单使用 目录seata执行过程安装seata下载seata使用自定义配置文件,NACOS为注册中心结合springboot实现AT模式1.多数据源引入依赖bootstrap.yml配置在使用的方法上用GlobalTransactional注解调用接口正常时调用接口报错时回滚2.配合feignseata优缺点seata执行过…...

计算机网络中的原码、反码、补码

写在前面 原码、反码、补码是计算机组成原理中的概念&#xff0c;是计算机网络的基础知识之一。这些概念是为了处理二进制数的符号位而引入的&#xff0c;常用于计算机中的整数运算&#xff0c;也常用于数据存储和传输等领域。因此&#xff0c;了解和掌握这些概念对于理解计算机…...

七、Bean的实例化方式

Spring为Bean提供了多种实例化方式&#xff0c;通常包括4种方式。&#xff08;也就是说在Spring中为Bean对象的创建准备了多种方案&#xff0c;目的是&#xff1a;更加灵活&#xff09; 第一种&#xff1a;通过构造方法实例化第二种&#xff1a;通过简单工厂模式实例化第三种&…...

Windows程序员学习Linux环境下VI(VIM)编辑器的使用方法

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Windows程序员如何学习Linux环境知识。由于很多程序在Windows环境下开发好后&#xff0c;还要部署到Linux服务器上去&#xff0c;所以作为Windows程序员有必要学习Linux环境的知识。VI…...

react入门篇

react入门篇前言一、目标二、项目环境三、实现过程&#xff08;干货满满&#x1f4a5;&#x1f4a5;&#x1f4a5;&#xff09;1.创建react项目2.arco design UI库3.路由模块化4. 状态管理zustand5. axios6. 路由守卫前言 提示&#xff1a;这里可以添加本文要记录的大概内容&a…...

阿赵的MaxScript学习笔记分享九《可编辑多面体的操作》

大家好&#xff0c;我是阿赵。这是MaxScript学习笔记分享的第九篇&#xff0c;可编辑多面体的操作。不知不觉写了这么多篇了&#xff0c;应该还有几篇就写完了。自己给自己加一下油。 在3DsMax里面如果需要建模&#xff0c;一般使用到的塌陷方式有3种&#xff0c;可编辑的网格、…...

【Redis场景5】集群秒杀优化-分布式锁

集群环境下的秒杀问题 前序 【Redis场景1】用户登录注册 【Redis场景2】缓存更新策略(双写一致) 【Redis场景3】缓存穿透、击穿问题 【Redis场景拓展】秒杀问题-全局唯一ID生成策略 【Redis场景4】单机环境下秒杀问题 在单机环境下的并发问题&#xff0c;我们可以使用相关…...

transformer目标检测开山之作detr

1. 将一个batch的图片输入backone获得feature。 &#xff08;2&#xff0c;c&#xff0c;w&#xff0c;h&#xff09;先输入resnet50中&#xff0c;得到&#xff08;2&#xff0c;2048&#xff0c;w&#xff0c;h&#xff09;。虽然这里channel不是256&#xff0c;但是在输入e…...

双指针法|位运算|离散化|区间合并

目录 双指针算法 位运算 离散化 序列合并 双指针算法 题目描述&#xff1a;1.输入n个单词&#xff0c;每个单词在输入的时候按空格隔开&#xff0c;之后打印出每个单词且换行 #include<iostream> #include <string>using namespace std; int main() {strin…...

Rockchip Android13 GKI开发指南

Rockchip Android13 GKI开发指南 文章目录Rockchip Android13 GKI开发指南GKI介绍Google upstream kernel下载及编译Rockchip SDK中GKI相关目录介绍Rockchip GKI编译代码修改编译固件烧写KO编译及修改添加新的模块驱动的方法调试ko方法开机log确认uboot阶段Android阶段KO加载KO…...

手把手教你原生JavaScript打造丝滑流畅的轮播图,让你的网站瞬间提升用户体验!

简介 轮播图是网页设计中常见的交互组件之一&#xff0c;用于展示多张图片或内容&#xff0c;让用户能够方便地浏览、切换和选择。本文将介绍如何使用原生 JavaScript 手写一个简单的轮播图&#xff0c;并且通过代码解释实现细节。 目录 简介 HTML 结构 CSS 样式 JavaScr…...

git常用基本操作

克隆远程代码更新本地代码 git clone <-b | -branch> [branch name] [repository URL] git pull #拉取远程仓库代码&#xff0c;更新本地仓库 git merge <branch-name> #合并目标分支 建立本地仓库分支 git branch #查看当…...

剑指 Offer —— 数组和字符串

文章目录剑指 Offer 04. 二维数组中的查找代码实现解题方案 思路算法步骤剑指 Offer 05. 替换空格题目描述代码实现解题方案 思路算法步骤剑指 Offer 11. 旋转数组的最小数字 - 解决方案题目描述剑指 Offer 04. 二维数组中的查找 在一个 n * m 的二维数组中&#xff1a; 每…...

Java 字符编码

编码&#xff1a;数据存储进计算机中需要转换为二进制存储&#xff0c;这个过程就是编码。 解码&#xff1a;计算机读取数据并展示在页面上&#xff0c;需要将二进制转换为人类语言的过程&#xff0c;叫做解码。 乱码&#xff1a;如果编码和解码时使用的码表不一样&#xff0c;…...

VisualVM安全监控指南:敏感数据保护与权限管理

VisualVM安全监控指南&#xff1a;敏感数据保护与权限管理 【免费下载链接】visualvm VisualVM is an All-in-One Java Troubleshooting Tool 项目地址: https://gitcode.com/gh_mirrors/vi/visualvm VisualVM作为一款强大的Java应用性能监控与故障诊断工具&#xff0c;…...

VS2019调试配置报错解析:Designtime生成失败与IntelliSense不可用的深度排查指南

1. 问题现象与初步诊断 当你打开VS2019项目时突然弹出"配置Debug|Win32的Designtime生成失败&#xff0c;IntelliSense可能不可用"的红色错误提示&#xff0c;代码编辑窗口里的智能提示全部消失&#xff0c;连最基本的语法高亮都失效了——这种场景我遇到过不下20次。…...

CLaMP技术深度解析:对比学习如何实现语言与音乐的完美融合

CLaMP技术深度解析&#xff1a;对比学习如何实现语言与音乐的完美融合 【免费下载链接】muzic 这是一个微软研究院开发的音乐生成AI项目。适合对音乐、音频处理以及AI应用感兴趣的开发者、学生和研究者。特点是使用深度学习技术生成音乐&#xff0c;具有较高的创作质量和听觉体…...

Android崩溃分析进阶:结合addr2line与IDA Pro精准定位SO文件崩溃点

1. 从崩溃日志到问题定位&#xff1a;为什么SO文件这么难缠&#xff1f; 每次看到Android应用崩溃日志里出现"signal 11 (SIGSEGV)"这种字样&#xff0c;我就知道今晚又要加班了。特别是当崩溃发生在SO文件中时&#xff0c;那种无力感就像在漆黑的房间里找一根掉落的…...

无GPU方案:星图平台OpenClaw镜像+百川2-13B-4bits的云端沙盒体验

无GPU方案&#xff1a;星图平台OpenClaw镜像百川2-13B-4bits的云端沙盒体验 1. 为什么选择云端沙盒方案 作为一个长期折腾本地AI部署的技术爱好者&#xff0c;我最近遇到了一个典型困境&#xff1a;想体验最新的OpenClaw智能体框架&#xff0c;但手头的MacBook Pro只有集成显…...

别再让DeepSeek-R1的<think>标签刷屏了!手把手教你用API和Python脚本一键隐藏思考过程

高效隐藏DeepSeek-R1思考过程的工程实践 当你在深夜调试一个集成DeepSeek-R1的客服系统时&#xff0c;终端突然被满屏的<think>标签刷爆——这种场景对开发者来说再熟悉不过了。作为一款强调推理过程的大语言模型&#xff0c;DeepSeek-R1默认会在输出中包含详细的思考步骤…...

暗黑破坏神2存档编辑器的创意实验:开启你的游戏世界无限可能

暗黑破坏神2存档编辑器的创意实验&#xff1a;开启你的游戏世界无限可能 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾想过在暗黑破坏神2的世界里创造属于自己的传奇&#xff1f;当传统的游戏进程无法满足你的创意需求…...

银河麒麟V10 SP1下使用rsync实现多客户端定时数据备份(避坑指南)

银河麒麟V10 SP1多客户端数据同步全链路配置与优化实战 在IT运维工作中&#xff0c;数据备份如同氧气般不可或缺。想象一下&#xff0c;当数十台客户端设备同时运行时&#xff0c;如何确保关键业务数据能够安全、高效地集中备份&#xff1f;银河麒麟V10 SP1作为国产操作系统的…...

如何构建高效离线OCR解决方案:从引擎选型到性能优化的完整指南

如何构建高效离线OCR解决方案&#xff1a;从引擎选型到性能优化的完整指南 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins 在数字化办公与信息处理中&#xff0c;文字识别&#xff08;OCR&#xff09;技…...

NaViL-9B多模态提示工程:图文联合prompt编写技巧与示例

NaViL-9B多模态提示工程&#xff1a;图文联合prompt编写技巧与示例 1. 多模态模型简介 NaViL-9B是一款原生支持多模态交互的大语言模型&#xff0c;能够同时处理文本和图像输入。与传统的纯文本模型不同&#xff0c;它具备视觉理解能力&#xff0c;可以分析图片内容并与用户进…...