基于注解的MyBatis-Plus单表查询条件构建工具

MyBatis-Plus-Query

简介

基于注解的MyBatis-Plus单表查询条件构建工具,为开发者提供一种声明式构建查询条件的快捷方式。

版本

  • JDK8 或更高版本

  • MyBatis-Plus 3.5.0 或更高版本

使用

  1. 添加依赖

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

<!-- mybatis-plus-query -->
<dependency>
    <groupId>site.lianwu</groupId>
    <artifactId>mybatis-plus-query</artifactId>
    <version>2.0.0</version>
</dependency>
  1. 使用注解

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

@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;

}
  1. 构建条件

    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<User> wrapper1 = QueryWrappers.parse(userDto2);

    // 包含继承字段
    // WHERE (age <= 18 AND id = 1 AND (email LIKE '%test%' OR name LIKE '%test%'))
    QueryWrapper<User> wrapper2 = QueryWrappers.parse(userDto2, true);
    
    QueryOption<User> option = QueryOption.<User>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<User> wrapper3 = QueryWrappers.parse(userDto2, option);

    // 包含继承字段
    // WHERE (age <= 18 AND id = 1 AND (email LIKE '%test%' OR name LIKE '%test%' OR address LIKE '%address%'))
    QueryWrapper<User> wrapper4 = QueryWrappers.parse(userDto2, true, option);

更多示例:mybatis-plus-query-sample

原理

  • 构建条件时,遍历条件对象的所有字段,提取并解析带有@Query和@NestedQuery注解的字段,最终生成MP的QueryWrapper。

  • 以常规条件包装处理器为例,条件构建过程中优先处理根分组,其次处理其余分组,分组约定使用and连接。

  • 由于底层使用了无序的数据结构记录分组,意味着对其余分组的处理是无序的,同样地,分组的条件设置也是无序的。

  • 若使用@Query定义or连接条件,为确保查询结果的正确性,建议为or逻辑连接的查询条件声明一个单独的分组。

  • 后置处理器只针对查询注解中声明的分组有效。若补充了某个分组的后置处理器,但该分组未在注解中声明,则相应的后置处理逻辑也不会被执行。

鸣谢

Gary(zjn)、Link(lsb)、Lauv(lyh)

License

Apache License 2.0

Comment