基于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类 完整代码 起因 最近两天一直写后台管理统计的增删改查(很少写增删改查,所以不是很熟练),几乎每个表都要涉及到条件查询的业务…...
【LeetCode】带环链表两道题
第一题:环形链表 问题介绍 给你一个链表的头节点head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos 来表示链表…...
CSS奇思妙想之-利用CSS裁剪(clip-path)完成各种图形
在日常开发当中,如果想要开发多边形,一般都需要多个盒子或者伪元素的帮助,有没有一直办法能只使用一个盒子实现呢? 有的:css裁剪 clip-path介绍 css裁剪(clip-path)这个属性平时率非常低。但是…...
力扣每日一题刷题总结:哈希表篇
剑指 Offer II 033.变位词组 Medium 哈希表 变位词 2023/3/3 给定一个字符串数组 strs ,将 变位词 组合在一起。 可以按任意顺序返回结果列表。 注意:若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。 示例: 示例 1:…...
【Redis】redis大key和大value的危害,如何处理?
前序 还记得上次和同事一起去面试候选人时,同事提了一个问题:Redis的大key有什么危害?当时候选人主要作答的角度是一个key的value较大时的情况,比如: 内存不均:单value较大时,可能会导致节点之…...
Spring Boot:实现MyBatis动态创建表
在有些应用场景中,我们会有需要动态创建和操作表的需求。 比如因为单表数据存储量太大而采取分表存储的情况,又或者是按日期生成日志表存储系统日志等等。这个时候就需要我们动态的生成和操作数据库表了。 而我们都知道,以往我们使用MyBati…...
SpringBoot+Seata在多数据源和feign中的简单使用
SpringBootSeata简单使用 目录seata执行过程安装seata下载seata使用自定义配置文件,NACOS为注册中心结合springboot实现AT模式1.多数据源引入依赖bootstrap.yml配置在使用的方法上用GlobalTransactional注解调用接口正常时调用接口报错时回滚2.配合feignseata优缺点seata执行过…...
计算机网络中的原码、反码、补码
写在前面 原码、反码、补码是计算机组成原理中的概念,是计算机网络的基础知识之一。这些概念是为了处理二进制数的符号位而引入的,常用于计算机中的整数运算,也常用于数据存储和传输等领域。因此,了解和掌握这些概念对于理解计算机…...
七、Bean的实例化方式
Spring为Bean提供了多种实例化方式,通常包括4种方式。(也就是说在Spring中为Bean对象的创建准备了多种方案,目的是:更加灵活) 第一种:通过构造方法实例化第二种:通过简单工厂模式实例化第三种&…...
Windows程序员学习Linux环境下VI(VIM)编辑器的使用方法
我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows程序员如何学习Linux环境知识。由于很多程序在Windows环境下开发好后,还要部署到Linux服务器上去,所以作为Windows程序员有必要学习Linux环境的知识。VI…...
react入门篇
react入门篇前言一、目标二、项目环境三、实现过程(干货满满💥💥💥)1.创建react项目2.arco design UI库3.路由模块化4. 状态管理zustand5. axios6. 路由守卫前言 提示:这里可以添加本文要记录的大概内容&a…...
阿赵的MaxScript学习笔记分享九《可编辑多面体的操作》
大家好,我是阿赵。这是MaxScript学习笔记分享的第九篇,可编辑多面体的操作。不知不觉写了这么多篇了,应该还有几篇就写完了。自己给自己加一下油。 在3DsMax里面如果需要建模,一般使用到的塌陷方式有3种,可编辑的网格、…...
【Redis场景5】集群秒杀优化-分布式锁
集群环境下的秒杀问题 前序 【Redis场景1】用户登录注册 【Redis场景2】缓存更新策略(双写一致) 【Redis场景3】缓存穿透、击穿问题 【Redis场景拓展】秒杀问题-全局唯一ID生成策略 【Redis场景4】单机环境下秒杀问题 在单机环境下的并发问题,我们可以使用相关…...
transformer目标检测开山之作detr
1. 将一个batch的图片输入backone获得feature。 (2,c,w,h)先输入resnet50中,得到(2,2048,w,h)。虽然这里channel不是256,但是在输入e…...
双指针法|位运算|离散化|区间合并
目录 双指针算法 位运算 离散化 序列合并 双指针算法 题目描述:1.输入n个单词,每个单词在输入的时候按空格隔开,之后打印出每个单词且换行 #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打造丝滑流畅的轮播图,让你的网站瞬间提升用户体验!
简介 轮播图是网页设计中常见的交互组件之一,用于展示多张图片或内容,让用户能够方便地浏览、切换和选择。本文将介绍如何使用原生 JavaScript 手写一个简单的轮播图,并且通过代码解释实现细节。 目录 简介 HTML 结构 CSS 样式 JavaScr…...
git常用基本操作
克隆远程代码更新本地代码 git clone <-b | -branch> [branch name] [repository URL] git pull #拉取远程仓库代码,更新本地仓库 git merge <branch-name> #合并目标分支 建立本地仓库分支 git branch #查看当…...
剑指 Offer —— 数组和字符串
文章目录剑指 Offer 04. 二维数组中的查找代码实现解题方案 思路算法步骤剑指 Offer 05. 替换空格题目描述代码实现解题方案 思路算法步骤剑指 Offer 11. 旋转数组的最小数字 - 解决方案题目描述剑指 Offer 04. 二维数组中的查找 在一个 n * m 的二维数组中: 每…...
Java 字符编码
编码:数据存储进计算机中需要转换为二进制存储,这个过程就是编码。 解码:计算机读取数据并展示在页面上,需要将二进制转换为人类语言的过程,叫做解码。 乱码:如果编码和解码时使用的码表不一样,…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
