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

数据库框架低代码查询工具类[自定义注解-反射-泛型]

目录

一、使用场景

二、框架使用

三、工具设计逻辑

四、代码工具逻辑实现

1.公用自定义注解设计

2.myabatis-Plus 框架使用

2-1.查询包装器生成的工具类

2-2.查询DTO类运用

2-3.service应用

3.jpa框架使用

3-1.查询包装器生成的工具类

3-2.查询DTO类运用

3-3.service应用

五、代码知识点解析

1.泛型

1-1.介绍

1-2.主要作用

1-3.核心概念

2.反射

2-1.介绍

2-2.核心概念

2-3.主要功能

3.自定义注解

3-1.基本概念

3-2.关键元注解


一、使用场景

在日常的工作中,我们难免会涉及单个报表的多个不同字段的查询,如果一个一个去声明查询操作类型(例如:like),开发时间长且日后维护时间较长,并不利于当下的快节奏的开发模式,那如何高效提高我们的报表查询工作呢?可以通过我们学习java基础知识去设计一下~

二、框架使用

本文数据库框架:mybatisPlus、jpa

java开发框架:springboot

java运用知识:自定义注解、反射、泛型

三、工具设计逻辑

1.通过使用自定义注解去配置查询DTO类进行字段声明

2.根据使用的数据库映射框架,进行针对性的泛型工具类设计,返回数据库DO的查询包装器

3.泛型工具类中,通过反射去获取查询DTO的注解内容,进行查询的拼接

4.从工具类获取到的查询包装器,根据数据库映射框架封装好的查询方法,进行获取我们所需的数据

四、代码工具逻辑实现

1.公用自定义注解设计

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface SearchCriteria { // 范围查询时, 用于指定字段名 String value() default ""; // 查询操作 SearchOperation operation() default SearchOperation.EQUAL; // 限制特定的方法使用 方法名用|包裹 例如:|page|report| String limitMethod() default ""; // in操作时的分离器 String separator() default ""; enum SearchOperation { IN, EQUAL, NOT_EQUAL, NOT_NULL, LIKE, LEFT_LIKE, RIGHT_LIKE, GREATER_THAN_EQUAL, GREATER_THAN, LESS_THAN_EQUAL, LESS_THAN } }

2.myabatis-Plus 框架使用

2-1.查询包装器生成的工具类

@Slf4j public class QueryWrapperBuilder<T> { public <T> QueryWrapper builderQueryWrapper(Object bean, String methodName) { QueryWrapper<T> queryWrapper = new QueryWrapper<>(); if (bean == null) { return queryWrapper; } try { for (Field field : bean.getClass().getDeclaredFields()) { field.setAccessible(true); SearchCriteria annotation = field.getAnnotation(SearchCriteria.class); Object fieldValue = field.get(bean); if (annotation == null || fieldValue == null || (field.getType() == String.class && StringUtils.isBlank(fieldValue.toString()))) { continue; } if (StringUtils.isNotBlank(annotation.limitMethod()) && methodName != null && !annotation.limitMethod().contains("|" + methodName + "|")) { continue; } String fieldName = StringUtils.isBlank(annotation.value()) ? field.getName() : annotation.value(); switch (annotation.operation()) { case EQUAL: queryWrapper.eq(fieldName, fieldValue); break; case GREATER_THAN_EQUAL: // 大于等于 queryWrapper.ge(fieldName, fieldValue); break; case GREATER_THAN: //大于 queryWrapper.gt(fieldName, fieldValue); break; case LESS_THAN_EQUAL: //小于等于 queryWrapper.le(fieldName, fieldValue); break; case LESS_THAN: //小于 queryWrapper.lt(fieldName, fieldValue); break; case LIKE: //中模糊查询 queryWrapper.like(fieldName, fieldValue); break; case LEFT_LIKE: //左模糊查询 queryWrapper.likeLeft(fieldName, fieldValue); break; case RIGHT_LIKE: //右模糊查询 queryWrapper.likeRight(fieldName, fieldValue); break;
http://www.jsqmd.com/news/1295954/

相关文章:

  • 3D滚动世界构建终极指南:从零到一的沉浸式体验创作
  • 如何突破大麦抢票难题:全自动抢票方案3分钟上手指南
  • AI Observe Stack(基于 Apache Doris):AI Agent 可观测性技术能力、选型对比与实践
  • 泛微E9-附件支持拖拽上传
  • OpCore-Simplify:自动化OpenCore配置解决方案,将Hackintosh部署时间缩短至30分钟
  • 从长鑫存储上市,看中国科技企业的品牌觉醒
  • 基于CNN的MNIST手写数字识别系统设计与实现
  • Krea2_FP8深度解析:FP8量化技术如何让AI图像生成平民化
  • OpenClaw TTS声学模型训练与优化实战指南
  • 2026年办公聊天工具有哪些?7款企业内部聊天软件对比 - IM软件测评
  • 10分钟上手Consul-k8s:从安装到服务注册的快速入门教程
  • 二维连杆机器人路径规划:RRT与RPM算法对比与Matlab实现
  • BookChatApp核心功能揭秘:书架管理、书签同步与阅读偏好设置全攻略
  • 商标Logo换新,需要注意哪些法律风险?
  • Python BitcoinLib多币种支持:Litecoin与Dogecoin集成教程
  • 太原桥梁护栏直销
  • 智能家居DIY:树莓派语音控制中心搭建指南
  • 2026年AI学术写作工具测评与使用策略
  • EB Garamond12:如何用免费开源字体让经典Garamond重获新生?5大优势解析
  • 企业级QQ空间数据归档解决方案:GetQzonehistory架构设计与最佳实践
  • 第49讲:通信协议Spec——帧头、帧尾、CRC、应答机制
  • EDA软件-PCB智能体自动布线
  • 2026年想在南京或苏州就业,选本地IT培训机构还是全国品牌? - 甄选测评馆
  • [ 经验 ] XTM2600 100V三相栅极驱动器深度分析
  • generator-core高级功能:自定义菜单与用户交互实现
  • 用这3招,小白也能造出高通过率的“黄金商标名称”
  • shadcn-docs-nuxt性能优化指南:提升文档加载速度的7个实用技巧
  • ncmdump终极解密指南:3分钟快速解锁网易云音乐NCM格式
  • AI Agent技术解析:从原理到实战应用
  • Polymarket Copy Trading Bot未来路线图:即将推出的新功能预览