# mybatis-plus-query **Repository Path**: lianwu930/mybatis-plus-query ## Basic Information - **Project Name**: mybatis-plus-query - **Description**: 基于注解的MyBatis-Plus单表查询条件构建工具,为开发者提供一种声明式构建查询条件的快捷方式。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-12 - **Last Updated**: 2025-02-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # [MyBatis-Plus-Query](https://gitee.com/lianwu930/mybatis-plus-query) ## 简介 基于注解的MyBatis-Plus单表查询条件构建工具,为开发者提供一种声明式构建查询条件的快捷方式。 ## 版本 - JDK8 或更高版本 - MyBatis-Plus 3.5.0 或更高版本 ## 使用 1. 添加依赖

首先,确保项目中已经添加了MyBatis-Plus依赖,其次添加MyBatis-Plus-Query依赖。

```xml site.lianwu mybatis-plus-query 2.0.0 ``` 2. 使用注解

@Query用于声明一个查询条件,可重复作用在字段上,@NestedQuery用于标记一个嵌套查询字段。

```java @Data public class UserDTO { @Query private Long id; } @Data public class UserDTO2 extends UserDTO { @Query(column = "email", value = ConditionType.Like.class, logic = Logic.OR, group = "KEYWORD") @Query(column = "name", value = ConditionType.Like.class, logic = Logic.OR, group = "KEYWORD") private String keyword; @NestedQuery private UserDTO3 userDto3; } @Data public class UserDTO3 { @Query(ConditionType.Le.class) private Integer age; } ``` 3. 构建条件 ```java UserDTO2 userDto2 = new UserDTO2(); userDto2.setId(1L); userDto2.setKeyword("test"); UserDTO3 userDto3 = new UserDTO3(); userDto3.setAge(18); userDto2.setUserDto3(userDto3); // 排除继承字段 // WHERE (age <= 18 AND (email LIKE '%test%' OR name LIKE '%test%')) QueryWrapper wrapper1 = QueryWrappers.parse(userDto2); // 包含继承字段 // WHERE (age <= 18 AND id = 1 AND (email LIKE '%test%' OR name LIKE '%test%')) QueryWrapper wrapper2 = QueryWrappers.parse(userDto2, true); QueryOption option = QueryOption.builder() // 补充"KEYWORD"组的查询条件 .appendPostProcessor("KEYWORD", wrapper -> { wrapper.lambda().or().like(User::getAddress, "address"); }).build(); // 排除继承字段 // WHERE (age <= 18 AND (email LIKE '%test%' OR name LIKE '%test%' OR address LIKE '%address%')) QueryWrapper wrapper3 = QueryWrappers.parse(userDto2, option); // 包含继承字段 // WHERE (age <= 18 AND id = 1 AND (email LIKE '%test%' OR name LIKE '%test%' OR address LIKE '%address%')) QueryWrapper wrapper4 = QueryWrappers.parse(userDto2, true, option); ``` 更多示例:[mybatis-plus-query-sample](https://gitee.com/lianwu930/mybatis-plus-query-sample) ## 原理
  • 构建条件时,遍历条件对象的所有字段,提取并解析带有@Query和@NestedQuery注解的字段,最终生成MP的QueryWrapper。
  • 以常规条件包装处理器为例,条件构建过程中优先处理根分组,其次处理其余分组,分组约定使用and连接。
  • 由于底层使用了无序的数据结构记录分组,意味着对其余分组的处理是无序的,同样地,分组的条件设置也是无序的。
  • 若使用@Query定义or连接条件,为确保查询结果的正确性,建议为or逻辑连接的查询条件声明一个单独的分组。
  • 后置处理器只针对查询注解中声明的分组有效。若补充了某个分组的后置处理器,但该分组未在注解中声明,则相应的后置处理逻辑也不会被执行。
## 鸣谢 Gary(zjn)、Link(lsb)、Lauv(lyh) ## License [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)