MyBatis-Plus Wrapper的or()方法进阶用法与实战示例

一、基础OR条件:简单字段间的OR连接

最核心的用法是通过or()切换逻辑连接,将多个独立条件用OR关联。适用于“满足任一条件即可”的场景,如查询“姓名为张三或邮箱为zhangsan@example.com”的用户。

示例1:两个独立条件的OR

// 使用QueryWrapper(通用写法)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三").or().eq("email", "zhangsan@example.com");
// 生成的SQL:WHERE name = '张三' OR email = 'zhangsan@example.com'

// 使用LambdaQueryWrapper(类型安全写法)
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getName, "张三").or().eq(User::getEmail, "zhangsan@example.com");
// 生成的SQL:WHERE name = '张三' OR email = 'zhangsan@example.com'

​说明​​:eq()构建具体条件,or()将后续条件与前一个条件转为OR关系,避免手写SQL的繁琐。

二、多OR条件组合:连续OR的链式调用

当需要“满足多个条件中的任意一个”时,可通过连续or()实现。每个or()后的条件都会与前一个条件形成OR关系,适用于“多关键词搜索”场景。

示例2:三个字段的OR组合

LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getName, "张三")
          .or().eq(User::getEmail, "zhangsan@example.com")
          .or().like(User::getPhone, "138%");
// 生成的SQL:WHERE name = '张三' OR email = 'zhangsan@example.com' OR phone LIKE '138%'

​说明​​:连续调用or()会将所有后续条件用OR串联,适合“输入框输入多个关键词”的搜索功能。

三、嵌套OR条件:OR与其他逻辑的组合

当OR条件需要与AND条件混合时,必须用and(Consumer<Param> consumer)包裹OR部分,确保OR条件作为一个整体,避免逻辑错误(如“状态有效且(姓名为张三或邮箱为zhangsan)”)。

示例3:AND包裹OR的混合条件

LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getStatus, "ACTIVE") // 状态必须为ACTIVE(AND条件)
          .and(wrapper -> wrapper.eq(User::getName, "张三") // 姓名为张三(OR分支1)
                                 .or().eq(User::getEmail, "zhangsan@example.com")); // 邮箱为zhangsan@example.com(OR分支2)
// 生成的SQL:WHERE status = 'ACTIVE' AND (name = '张三' OR email = 'zhangsan@example.com')

​关键点​​:and()内的or()会将多个条件包裹在括号中,确保OR条件的整体性,符合业务逻辑需求。

四、动态OR条件:根据业务需求灵活控制

在实际开发中,OR条件的使用往往需要根据用户输入或配置动态调整。可通过or(boolean condition)方法控制是否添加OR逻辑,或通过or(Consumer<Param> consumer)动态构建OR分支。

示例4:动态添加OR条件

// 根据用户输入的“是否搜索邮箱”动态添加OR条件
boolean searchByEmail = true; // 假设从请求参数获取
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getStatus, "ACTIVE"); // 基础条件:状态有效
if (searchByEmail) {
    lambdaQuery.or().eq(User::getEmail, "zhangsan@example.com"); // 动态添加OR条件
}
// 若searchByEmail=true,SQL:WHERE status = 'ACTIVE' OR email = 'zhangsan@example.com'
// 若searchByEmail=false,SQL:WHERE status = 'ACTIVE'

示例5:动态嵌套OR条件

// 根据用户输入的“是否搜索姓名或电话”动态构建OR分支
boolean searchByNameOrPhone = false; // 假设从请求参数获取
LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.eq(User::getStatus, "ACTIVE"); // 基础条件:状态有效
lambdaQuery.and(wrapper -> {
    if (searchByNameOrPhone) {
        wrapper.eq(User::getName, "张三").or().like(User::getPhone, "138%"); // 动态添加OR分支
    } else {
        wrapper.eq(User::getEmail, "zhangsan@example.com"); // 默认OR条件
    }
});
// 若searchByNameOrPhone=true,SQL:WHERE status = 'ACTIVE' AND (name = '张三' OR phone LIKE '138%')
// 若searchByNameOrPhone=false,SQL:WHERE status = 'ACTIVE' AND email = 'zhangsan@example.com'

​优势​​:通过条件判断控制or()的添加,避免不必要的条件拼接,提升查询灵活性。

五、复杂场景:OR与IN、LIKE、BETWEEN等方法的组合

OR条件可与MyBatis-Plus的其他查询方法(如in()like()between())结合,满足更复杂的业务需求,如“查询指定ID列表中的用户,或其年龄在20-30岁之间的用户”。

示例6:OR与IN组合

LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.in(User::getId, Arrays.asList(1L, 2L, 3L)) // ID在1、2、3中(OR关系)
          .or().between(User::getAge, 20, 30); // 年龄在20-30之间(OR条件)
// 生成的SQL:WHERE id IN (1, 2, 3) OR age BETWEEN 20 AND 30

示例7:OR与LIKE组合(模糊搜索)

LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.like(User::getName, "张") // 姓名包含“张”(OR分支1)
          .or().like(User::getEmail, "@example.com"); // 邮箱包含“@example.com”(OR分支2)
// 生成的SQL:WHERE name LIKE '%张%' OR email LIKE '%@example.com%'

示例8:OR与BETWEEN组合(范围查询)

LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
lambdaQuery.between(User::getCreateTime, LocalDateTime.now().minusDays(7), LocalDateTime.now()) // 最近7天创建(OR分支1)
          .or().between(User::getAge, 18, 25); // 年龄在18-25岁之间(OR分支2)
// 生成的SQL:WHERE create_time BETWEEN '2025-08-18' AND '2025-08-25' OR age BETWEEN 18 AND 25

​说明​​:in()like()between()等方法生成的OR条件,可与and()or()组合,实现“多维度、多条件”的复杂查询。

六、实战案例:用户管理系统的搜索功能

假设需要实现一个用户管理系统的搜索功能,要求支持“按姓名、邮箱、电话搜索,且状态必须有效”,并允许用户选择“精确匹配”或“模糊匹配”。

示例9:实战搜索功能实现

public List<User> searchUsers(String keyword, boolean exactMatch) {
    LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>();
    lambdaQuery.eq(User::getStatus, "ACTIVE"); // 基础条件:状态有效
    
    if (StringUtils.isNotBlank(keyword)) {
        if (exactMatch) {
            // 精确匹配:姓名=keyword OR 邮箱=keyword OR 电话=keyword
            lambdaQuery.or().eq(User::getName, keyword)
                      .or().eq(User::getEmail, keyword)
                      .or().eq(User::getPhone, keyword);
        } else {
            // 模糊匹配:姓名包含keyword OR 邮箱包含keyword OR 电话包含keyword
            lambdaQuery.or().like(User::getName, keyword)
                      .or().like(User::getEmail, keyword)
                      .or().like(User::getPhone, keyword);
        }
    }
    
    return userMapper.selectList(lambdaQuery);
}

​说明​​:通过exactMatch参数控制匹配方式,or()将多个搜索条件串联,满足“任意字段匹配即可”的需求,适用于用户管理系统的搜索框功能。

通过以上例子,可全面掌握MyBatis-Plus Wrapper的or()方法的各种用法,从简单到复杂,从静态到动态,满足不同业务场景的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值