导读:本期聚焦于小伙伴创作的《MyBatis-Plus的条件构造器Wrapper怎么用_链式编程实现复杂查询条件拼接》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《MyBatis-Plus的条件构造器Wrapper怎么用_链式编程实现复杂查询条件拼接》有用,将其分享出去将是对创作者最好的鼓励。

MyBatis-Plus的条件构造器Wrapper是封装查询条件的核心组件,支持通过链式编程的方式灵活拼接各类查询条件,无需手动编写SQL语句即可完成复杂查询逻辑的构建。它提供了QueryWrapper、UpdateWrapper等多个实现类,分别对应查询、更新等不同场景的条件构造需求。

MyBatis-Plus的条件构造器Wrapper怎么用_链式编程实现复杂查询条件拼接

Wrapper基础概念与核心类

Wrapper是所有条件构造器的父类,常用的子类主要有两类:QueryWrapper用于构建查询条件,UpdateWrapper用于构建更新条件。两者都支持链式调用,每个条件方法都会返回当前Wrapper实例,方便连续拼接条件。

核心条件方法包括:

  • eq:等于条件
  • ne:不等于条件
  • gt:大于条件
  • lt:小于条件
  • like:模糊查询条件
  • between:范围查询条件
  • and:拼接与条件
  • or:拼接或条件

基础链式查询示例

假设我们有一个用户表对应的实体类User,包含id、name、age、email四个字段,现在需要查询年龄大于18且名字包含张的用户数据,使用QueryWrapper的链式编程实现如下:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;

public class WrapperDemo {
    // 假设userMapper是已经注入的UserMapper实例
    private UserMapper userMapper;

    public void basicQuery() {
        // 创建QueryWrapper实例
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 链式拼接条件:年龄大于18 且 名字包含张
        queryWrapper.gt("age", 18).like("name", "张");
        // 执行查询
        List<User> userList = userMapper.selectList(queryWrapper);
        // 输出查询结果
        userList.forEach(System.out::println);
    }
}

复杂条件组合拼接

实际业务中经常会遇到需要组合多个与或条件的场景,比如查询年龄大于18且小于30,或者名字包含李,且邮箱不为空的用户。这时候可以通过andor方法结合lambda表达式实现复杂的逻辑组合:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;

public class ComplexWrapperDemo {
    private UserMapper userMapper;

    public void complexQuery() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 拼接复杂条件:(age > 18 AND age < 30) OR (name LIKE '%李%') AND email IS NOT NULL
        queryWrapper.and(wrapper -> wrapper.gt("age", 18).lt("age", 30))
                   .or(wrapper -> wrapper.like("name", "李"))
                   .isNotNull("email");
        List<User> userList = userMapper.selectList(queryWrapper);
        userList.forEach(System.out::println);
    }
}

范围查询与模糊查询结合

如果需要查询创建时间在某个时间段内,且状态为正常的用户,同时名字不包含测试关键词,可以通过以下方式拼接条件:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.time.LocalDateTime;
import java.util.List;

public class RangeQueryDemo {
    private UserMapper userMapper;

    public void rangeQuery() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        // 时间范围:2024-01-01到2024-06-30
        LocalDateTime startTime = LocalDateTime.of(2024, 1, 1, 0, 0, 0);
        LocalDateTime endTime = LocalDateTime.of(2024, 6, 30, 23, 59, 59);
        queryWrapper.between("create_time", startTime, endTime)
                   .eq("status", 1)
                   .notLike("name", "测试");
        List<User> userList = userMapper.selectList(queryWrapper);
        userList.forEach(System.out::println);
    }
}

UpdateWrapper实现更新条件拼接

除了查询场景,UpdateWrapper可以用于构建更新条件,比如将年龄大于30且状态为0的用户状态更新为1,同时更新修改时间:

import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import java.time.LocalDateTime;

public class UpdateWrapperDemo {
    private UserMapper userMapper;

    public void updateWithWrapper() {
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        // 拼接更新条件:年龄大于30 且 状态为0
        updateWrapper.gt("age", 30).eq("status", 0);
        // 设置更新内容
        User updateUser = new User();
        updateUser.setStatus(1);
        updateUser.setUpdateTime(LocalDateTime.now());
        // 执行更新
        int rows = userMapper.update(updateUser, updateWrapper);
        System.out.println("更新行数:" + rows);
    }
}

使用LambdaWrapper避免字段名硬编码

上面的示例中条件字段都是用字符串硬编码的,容易出现字段名拼写错误的问题,MyBatis-Plus提供了LambdaQueryWrapper和LambdaUpdateWrapper,可以通过方法引用获取字段名,避免硬编码:

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.List;

public class LambdaWrapperDemo {
    private UserMapper userMapper;

    public void lambdaQuery() {
        // 创建LambdaQueryWrapper实例
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 链式拼接条件,通过方法引用获取字段名,避免硬编码
        lambdaQueryWrapper.gt(User::getAge, 18)
                         .like(User::getName, "张")
                         .eq(User::getStatus, 1);
        List<User> userList = userMapper.selectList(lambdaQueryWrapper);
        userList.forEach(System.out::println);
    }
}

注意事项

使用Wrapper时需要注意几个问题:一是条件拼接的顺序会影响最终生成的SQL逻辑,尤其是and和or的组合需要符合业务逻辑预期;二是如果条件值可能为null,需要先做非空判断,避免拼接无效条件;三是LambdaWrapper虽然避免了硬编码,但无法使用数据库函数相关的条件拼接,此时可以选择普通Wrapper结合常量定义字段名的方式减少错误。

MyBatis_PlusWrapper链式编程复杂查询修改时间:2026-06-18 03:03:21

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。