1. MyBatis-Plus 复杂查询实战指南
在 Java 持久层框架中,MyBatis-Plus 作为 MyBatis 的增强工具,通过简洁的 API 大幅提升了开发效率。但在实际业务中,我们经常会遇到需要自定义 SQL 和构建复杂查询的场景。本文将深入探讨如何在不失 MyBatis-Plus 便捷性的前提下,灵活应对各种复杂查询需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能解析
2.1 基础查询能力扩展
MyBatis-Plus 的 QueryWrapper 提供了丰富的条件构造方法:
java复制QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "张")
.between("age", 20, 30)
.isNotNull("email");
对于需要复用查询条件的场景,建议采用链式调用+方法封装的方式:
java复制public QueryWrapper<User> buildUserQuery(String keyword, Integer minAge) {
return new QueryWrapper<User>()
.and(wrapper -> wrapper
.like("username", keyword)
.or()
.like("email", keyword))
.ge(minAge != null, "age", minAge);
}
注意:字段名建议使用字符串常量或通过 Lambda 表达式引用,避免硬编码带来的维护问题
2.2 复杂条件构建技巧
处理多表关联查询时,可以采用以下策略:
- 子查询构造:
java复制queryWrapper.inSql("dept_id", "SELECT id FROM department WHERE status = 1");
- 动态条件拼接:
java复制queryWrapper.nested(wrapper -> {
wrapper.eq("type", 1).or().eq("type", 2);
}).apply("date_format(create_time,'%Y-%m') = {0}", "2023-01");
- 函数式条件:
java复制queryWrapper.apply("LENGTH(name) > {0}", 5)
.func(condition, wrapper -> wrapper.eq("status", 1));
3. 自定义 SQL 实现方案
3.1 XML 映射文件方式
在 mapper 接口中定义方法:
java复制@Select("SELECT * FROM user ${ew.c
