# mybatis-plus-query **Repository Path**: sections/mybatis-plus-query ## Basic Information - **Project Name**: mybatis-plus-query - **Description**: 通过@Query注解简化MybatisPlus中的QueryWrapper的复杂的条件组装过程,简化开发工作量,提升开发效率 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: https://gitee.com/sections/mybatis-plus-query - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-02-09 - **Last Updated**: 2024-09-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mybatis-plus-query ## 1 介绍 该组件的核心思想是通过@Query注解简化MybatisPlus中的QueryWrapper的条件组装,极大提升查询开发效率。 原来你需要这样组织查询条件,代码杂乱容易出错: ```java LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .like(queryParam.getName() != null, queryParam::getName, queryParam.getName()) .eq(!StringUtils.isEmpty(queryParam.getCode()), queryParam::getCode, queryParam.getCode()) .ge(queryParam.getStartDateFrom() != null, queryParam::getStartDate, queryParam.getStartDateFrom()) .le(queryParam.getStartDateTo() != null, queryParam::getStartDate, queryParam.getStartDateTo()) .eq(queryParam.getState() != null, queryParam::getState, queryParam.getState()) .orderByAsc(queryParam::getPhone); ``` 现在使用mybatis-plus-query后可以简化成这样: ```java QueryWrapper queryWrapper = QueryConverter.convert(queryParam); ``` ## 2 基本原理 1. mybatis-plus-query基于注解的思想,把查询条件的组织逻辑,标注到查询参数对象上,上面例子中对应的查询对象如下定义: ```java public class QueryParam { @Query(Operator.LIKE) private String name; @Query(Operator.EQ) private String code; @Query(Operator.GE) private Date StartDateFrom; @Query(Operator.LE) private Date StartDateTo; @Query(Operator.EQ) private String state; private List sorters; } ``` 2. 然后通过QueryConverter工具类,来解析注解,生成对应的QueryWrapper,就像这样一步完成查询转换: ```java QueryWrapper queryWrapper = QueryConverter.convert(queryParam); ``` ## 3 具体用法 #### 3.1 引入POM依赖 ```xml io.gitee.sections mybatis-plus-query 1.2 ``` #### 3.2 @Query注解介绍 Query注解支持所有mybatis-plus的查询操作:EQ, NE, GT, GE, LT, LE, LIKE, LIKE_LEFT, LIKE_RIGHT, NOT_LIKE, IS_NULL, IS_NOT_NULL, IN, NOT_IN, BETWEEN, NOT_BETWEEN, APPLY。 下面是一些高级用法案例: ```java public class QueryParam { //使用column指定数据库列名,若不指定则默认根据查询对象字段名生成 @Query(operator = Operator.LIKE, column = "user_name") private String name; //默认情况下null值不参与条件组装,可以通过ignoreNull=false来指定null参与条件组装,它将被转换为isNull操作 @Query(operator = Operator.EQ, ignoreNull = false) private String code; //支持between操作,需要传入一个集合或数组,且必须有两个元素 @Query(operator = Operator.BETWEEN) private List ageRange; //支持in操作,需要传入一个集合或数组,可以通过ignoreEmpty参数来设置空集合是否参与条件组织 @Query(operator = Operator.IN, ignoreEmpty = false) private List states; //支持使用mybatis-plus的apply方法实现动态的sql拼接 @Query(operator = Operator.APPLY, applySql="name like {0} or code like {0}") private String keyword; } ``` #### 3.3 PageQuery和PageResult PageQuery和PageResult用于实现分页查询。 1. PageQuery可以作为分页查询对象的父类,提供了分页查询的公共参数:current(当前页码,默认1)、pageSize(每页大小,默认10)、sorters(排序字段) 2. PageResult作为分页查询的返回对象,其字段设计与前端antd框架的ProTable要求的结构保持一致,方便前端使用 ```java import io.gitee.sections.query.Operator; import io.gitee.sections.query.PageQuery; import io.gitee.sections.query.Query; //使用PageQuery作为分页查询对象的父类 public class UserQueryDTO extends PageQuery{ @Query(Operator.LIKE) private String name; @Query(Operator.GT) private Integer age; @Query(Operator = Operator.IN) private List types; } ``` ```java import io.gitee.sections.query.PageResult; import io.gitee.sections.query.QueryConverter; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.util.function.Function; public class UserRepository extends ServiceImpl { public PageResult query(UserQueryDTO userQueryDTO){ final QueryWrapper queryWrapper = QueryConverter.convert(userQueryDTO); final Page page = new Page<>(userQueryDTO.getCurrent(), userQueryDTO.getPageSize()); super.page(page, queryWrapper); //把mybatis-plus的page对象转换为本框架提供的PageResult对象 return PageResult.convert(page, Function.identity()); } } ``` > 注意:分页查询需要配置mybatis-plus的PaginationInnerInterceptor启用 #### 3.4 ListQuery ListQuery用于列表查询,可以作为列表查询对象的父类,包含列表查询的基础字段:limit(限制查询数量,默认50)、sorters(排序字段) ```java import io.gitee.sections.query.Operator; import io.gitee.sections.query.ListQuery; import io.gitee.sections.query.Query; //使用ListQuery作为列表查询对象的父类 public class UserQueryDTO extends ListQuery{ @Query private Integer age; @Query(Operator.LIKE) private String name; } ``` #### 3.5 Sorter Sorter用于查询排序,在PageQuery和ListQuery中默认包含一个List sorters字段,可以直接使用。 QueryConverter在生成QueryWrapper时会识别sorters字段并生成排序条件