一、基础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()
方法的各种用法,从简单到复杂,从静态到动态,满足不同业务场景的需求。