![數(shù)據(jù)庫(kù)框架低代碼查詢工具類[自定義注解-反射-泛型]](http://pic.xiahunao.cn/yaotu/數(shù)據(jù)庫(kù)框架低代碼查詢工具類[自定義注解-反射-泛型])
目錄一、使用場(chǎng)景二、框架使用三、工具設(shè)計(jì)邏輯四、代碼工具邏輯實(shí)現(xiàn)1.公用自定義注解設(shè)計(jì)2.myabatis-Plus 框架使用2-1.查詢包裝器生成的工具類2-2.查詢DTO類運(yùn)用2-3.service應(yīng)用3.jpa框架使用3-1.查詢包裝器生成的工具類3-2.查詢DTO類運(yùn)用3-3.service應(yīng)用五、代碼知識(shí)點(diǎn)解析1.泛型1-1.介紹1-2.主要作用1-3.核心概念2.反射2-1.介紹2-2.核心概念2-3.主要功能3.自定義注解3-1.基本概念3-2.關(guān)鍵元注解一、使用場(chǎng)景在日常的工作中,我們難免會(huì)涉及單個(gè)報(bào)表的多個(gè)不同字段的查詢,如果一個(gè)一個(gè)去聲明查詢操作類型(例如:like),開發(fā)時(shí)間長(zhǎng)且日后維護(hù)時(shí)間較長(zhǎng),并不利于當(dāng)下的快節(jié)奏的開發(fā)模式,那如何高效提高我們的報(bào)表查詢工作呢?可以通過我們學(xué)習(xí)java基礎(chǔ)知識(shí)去設(shè)計(jì)一下~二、框架使用本文數(shù)據(jù)庫(kù)框架:mybatisPlus、jpajava開發(fā)框架:springbootjava運(yùn)用知識(shí):自定義注解、反射、泛型三、工具設(shè)計(jì)邏輯1.通過使用自定義注解去配置查詢DTO類進(jìn)行字段聲明2.根據(jù)使用的數(shù)據(jù)庫(kù)映射框架,進(jìn)行針對(duì)性的泛型工具類設(shè)計(jì),返回?cái)?shù)據(jù)庫(kù)DO的查詢包裝器3.泛型工具類中,通過反射去獲取查詢DTO的注解內(nèi)容,進(jìn)行查詢的拼接4.從工具類獲取到的查詢包裝器,根據(jù)數(shù)據(jù)庫(kù)映射框架封裝好的查詢方法,進(jìn)行獲取我們所需的數(shù)據(jù)四、代碼工具邏輯實(shí)現(xiàn)1.公用自定義注解設(shè)計(jì)@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface SearchCriteria { // 范圍查詢時(shí), 用于指定字段名 String value() default ""; // 查詢操作 SearchOperation operation() default SearchOperation.EQUAL; // 限制特定的方法使用 方法名用|包裹 例如:|page|report| String limitMethod() default ""; // in操作時(shí)的分離器 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;