![數據庫框架低代碼查詢工具類[自定義注解-反射-泛型]](http://pic.xiahunao.cn/yaotu/數據庫框架低代碼查詢工具類[自定義注解-反射-泛型])
目錄一、使用場景二、框架使用三、工具設計邏輯四、代碼工具邏輯實現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、jpajava開發框架:springbootjava運用知識:自定義注解、反射、泛型三、工具設計邏輯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 QueryWrapperBuilderT { public T QueryWrapper builderQueryWrapper(Object bean, String methodName) { QueryWrapperT 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;