zoukankan      html  css  js  c++  java
  • 【记录】mybatis-plus 根据自定义注解反射实现条件拼接查询

     自定义注解动态拼接查询条件

    引入依赖

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
            </dependency>
            <!--swagger2-->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
            </dependency>
    QueryWapper自定义注解
    import com.supconit.its.generator.enums.QueryWapperEnum;
    import org.springframework.stereotype.Indexed;
    
    import java.lang.annotation.*;
    
    
    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Indexed
    public @interface QueryWapper {
    
        String field() default "";
    
        QueryWapperEnum queryWapperEnum() default QueryWapperEnum.EQ ;
    }
    QueryWapperEnum枚举类
    /**
     * @Description 查询枚举类
     * @Date 2020-07-16 16:10
     */
    public enum QueryWapperEnum {
    
        LIKE(1),EQ(2);
    
        private final int value;
    
        QueryWapperEnum(int value) {
            this.value = value;
        }
    
        public int value() {
            return this.value;
        }
    }

    实体类加注解

    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    import lombok.Data;
    import io.swagger.annotations.ApiParam;
    import com.baomidou.mybatisplus.annotation.TableField;
    import com.xx.xx.generator.stereotype.QueryWapper;
    import com.xx.xx.generator.enums.QueryWapperEnum;
    
    @Data
    @ApiModel(value = "XX", description = "XX")
    public class PersBO {
    
    
     @ApiModelProperty(value = " 姓名  ")
     @TableField(value = "name ")
     @ApiParam(value = " 姓名 ",example = "",required = false)
     @QueryWapper(field = "name",queryWapperEnum = QueryWapperEnum.EQ )
     private String name;
    
    /**
     * 当前页数
     */
    @ApiModelProperty(value = "当前页数", example = "1", required = true)
    private Integer current;
    /**
     * 每页条数
     */
    @ApiModelProperty(value = "每页条数", example = "10", required = true)
    private Integer size;
    }
    QueryWrapperUtil工具类
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.supconit.its.generator.enums.QueryWapperEnum;
    import com.supconit.its.generator.stereotype.QueryWapper;
    import org.springframework.core.annotation.AnnotationUtils;
    import org.springframework.util.ObjectUtils;
    
    import java.lang.reflect.Field;
    
    import static org.apache.commons.lang3.reflect.MethodUtils.invokeMethod;
    
    /**
     * @Description 拼接查询条件工具类
     */
    public class QueryWrapperUtil {
    
        /**
         * 拼接查询条件
         *
         * @param queryWrapper 条件对象
         * @param obj          数据实体
         * @return void 返回参数说明
         * @exception/throws
         */
        public static void convertQuery(QueryWrapper queryWrapper, Object obj) {
            Class clazz = obj.getClass();
            try {
                // 反射遍历属性
                for (Field field : clazz.getDeclaredFields()) {
                    // 获取属性名
                    String fieldname = field.getName();
                    // 抑制Java对修饰符的检查
                    field.setAccessible(true);
                    // 获取属性值
                    Object fieldValue =  field.get(obj);
    //            String fieldValue = getFieldValue(obj ,field.getName()).toString();
                    // 查询注解
                    QueryWapper queryWapperAnnotation = AnnotationUtils.getAnnotation(field, QueryWapper.class);
                   if(ObjectUtils.isEmpty(queryWapperAnnotation)){
                       continue;
                   }
                    String fieldName = queryWapperAnnotation.field();
                    // 获取枚举
                    QueryWapperEnum queryWapperEnum = queryWapperAnnotation.queryWapperEnum();
                    // 拼接查询条件
                    switch (queryWapperEnum) {
                        case EQ:
                            queryWrapper.eq(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
                            break;
                        case LIKE:
                            queryWrapper.like(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
                            break;
                        default:
                            break;
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取属性名
         *
         * @exception/throws
         */
        private static String getFieldValue(Object owner, String fieldName) {
            try {
                return invokeMethod(owner, fieldName, null).toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    }

    Mapper类

    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import org.apache.ibatis.annotations.Mapper;
    import com.xx.xx.PersDTO;
    
    /**
     * <p>
     * Mapper 接口
     * </p>
     *
     */
    @Mapper
    public interface PersMapper extends BaseMapper<PersDTO> {
    
    }

    实现类使用

     Page<PersDTO> page = new Page(persBO.getCurrent(), persBO.getSize());
     // 拼接查询条件
     QueryWrapper<PersDTO> persDTOQueryWrapper = new QueryWrapper<>();
     QueryWrapperUtil.convertQuery(persDTOQueryWrapper,persBO);
     IPage<PersDTO> iPage = persMapper.selectPage(page, persDTOQueryWrapper);
      page.setRecords(iPage.getRecords());
  • 相关阅读:
    升级Node和Calico
    K8S在原有的集群上新增node节点(v1.19.5)
    Django的quickstart
    Jenkins配置python自动化点检项目
    Django的ORM一对多查询及联合查询
    Django的ORM查询
    mac系统安装mysqlclient的一些坑(附解决方法)
    tomcat中Context标签使用
    pipline语法
    android----AndroidViewModel访问SharedPreference,重启手机数据也存在
  • 原文地址:https://www.cnblogs.com/wbl001/p/13334738.html
Copyright © 2011-2022 走看看