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

MyBatis-Plus-Query

简介

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>1.1.0</version>
</dependency>
  1. 使用注解

@Query用于声明一个查询条件,可重复作用在字段上,而@NestedQuery用于表明一个待嵌套解析的字段。

@Data
public class UserDto {


    @Query(validation = Validator.NotBlank.class, column = "email", value = ConditionType.Like.class, logic = Logic.OR, groupId = "KEYWORD")
    @Query(validation = Validator.NotBlank.class, column = "name", value = ConditionType.Like.class, logic = Logic.OR, groupId = "KEYWORD")
    private String keyword;

    @NestedQuery
    private UserDto2 userDto2;

}

@Data
public class UserDto2 {

    @Query(ConditionType.Le.class)
    private Integer age;

}

  1. 构建并执行查询
    UserDto userDto = new UserDto();
    userDto.setKeyword("test");
    UserDto2 userDto2 = new UserDto2();
    userDto2.setAge(35);
    userDto.setUserDto2(userDto2);
    
    QueryWrapper<User> wrapper = QueryWrappers.parse(userDto);
    // WHERE (age <= 35 AND (email LIKE '%test%' OR name LIKE '%test%'))
    userMapper.selectList(wrapper);

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

原理

  1. 注解驱动:MyBatis-Plus-Query利用Java的注解(Annotation)机制来声明查询条件。开发者通过在类字段上使用@Query和@NestedQuery注解来定义查询逻辑。
  2. 条件解析:在构建查询时,MyBatis-Plus-Query会遍历条件对象的所有字段,提取并解析带有@Query和@NestedQuery注解的字段,最终生成MP的QueryWrapper对象。
    • 对于@Query中的属性值:
      • value:查询条件的比较方式,默认Eq(=)
      • column:指定条件列名,默认将字段名驼峰转下划线
      • logic:逻辑操作符,默认(and),表示分组内条件间的逻辑关系
      • groupId:分组ID(分组是对SQL中括号的抽象),默认根组,即查询条件最外层括号 WHERE (...)
      • validation:校验规则,默认字段值不为空,校验通过的字段值才参与条件构建
    • 对于@NestedQuery中的属性值:
      • value:是否包含继承字段,默认不包含

    以默认的条件包装处理器为例,解析过程中优先处理根分组,其次处理其余分组,分组间约定使用and连接。

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

    因此,若使用or逻辑条件处理,为确保查询结果的正确性,建议为这些or查询条件声明一个单独的分组。

其他/扩展

  • 数据缓存:MyBatis-Plus-Query提供了缓存数据的配置选项。在针对反射的性能优化上,默认开启对字段或者实例获取的缓存;在查询条件类的构建过程中,默认开启了对提取数据的缓存。

  • 条件补充:解析过程中允许用户添加额外的查询条件,通过使用QueryOption的Builder补充不同分组的后置处理器以补充查询逻辑,在默认的处理器中,后置处理器只针对查询注解中声明的分组有效。这意味着即使补充了某个分组的后置处理逻辑,若该分组未在注解中声明,则相应的后置处理逻辑也不会被执行。

  • 自定义校验规则/查询条件:开发者可自定义校验类(实现Validation接口)或自定义查询条件类(实现Condition接口),在@Query相应的属性值中指定类对象,以满足业务需求。

  • 插件式处理器:开发者可以自定义处理器(实现QueryFieldProcessor、QueryClassProcessor或QueryWrapperProcessor接口),在外观工具类QueryWrappers中实现插件式的组装,以支持更复杂的查询需求。

鸣谢

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

License

Apache License 2.0


v1.1.0 - 2024/07/19

改进

  • 补充安全的查询类处理器,支持检测循环引用,默认使用该处理器进行提取和解析
  • 更正部分代码注释
  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中使用MyBatis-Plus进行条件查询非常简单。以下是一些示例代码,演示了如何使用MyBatis-Plus进行条件查询: 1. 首先,确保在pom.xml文件中添加了MyBatis-Plus的依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本</version> </dependency> ``` 2. 创建一个实体类,表示数据库表中的一条记录。使用`@TableName`注解指定数据库表名,使用`@TableField`注解指定字段映射关系。 ```java import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableField; @TableName("user") public class User { private Long id; @TableField("username") private String username; @TableField("age") private Integer age; // 省略getter和setter方法 } ``` 3. 创建一个Mapper接口,继承自`BaseMapper`接口,并且使用`@Mapper`注解标记为MyBatis的Mapper。 ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserMapper extends BaseMapper<User> { } ``` 4. 在Service层中注入UserMapper,并且使用MyBatis-Plus提供的查询构造器进行条件查询。 ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> findUsersByAgeRange(int minAge, int maxAge) { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.between("age", minAge, maxAge); return userMapper.selectList(queryWrapper); } } ``` 在上述示例中,`QueryWrapper`是MyBatis-Plus提供的查询构造器,可以使用它来构建查询条件。`between`方法用于指定age字段在minAge和maxAge之间的范围。 这只是一个简单的示例,你可以根据自己的需求使用更多的查询条件和操作符。MyBatis-Plus还提供了许多其他功能,如分页查询和动态条件查询等。你可以查阅MyBatis-Plus官方文档来了解更多信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值