Mybatisplus的queryWrapper的or对字段做函数处理
Mybatis-plus的QueryWrapper中的or方法可以使用Lambda表达式对字段进行函数处理,例如:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.or(i -> Functions.upper(i.getStr("name")).like("%" + keyword.toUpperCase() + "%"))
.or(i -> Functions.length(i.getStr("phone")).gt(10));
在这个示例中,我们使用了Lambda表达式对name字段执行了upper函数,对phone字段执行了length函数,并将它们分别放在了两个or方法中,表示或者的关系。这样就可以在查询时对字段进行函数处理了。
mybatisplus分页查询or
使用 MyBatis-Plus 实现包含 OR 逻辑的分页查询
在 MyBatis-Plus 中,可以通过 QueryWrapper
或者 LambdaQueryWrapper
构建复杂的查询条件,包括 OR 和 AND 的组合。为了实现带有 OR 逻辑的分页查询,可以按照以下方法操作。
示例代码
以下是基于 MyBatis-Plus 的分页查询并包含 OR 条件的具体实现:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public Page<User> getUsersWithOrCondition(int currentPage, int pageSize, String name, Integer age) {
// 创建分页对象
Page<User> page = new Page<>(currentPage, pageSize);
// 创建 QueryWrapper 对象用于构建查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 添加 OR 查询条件
queryWrapper.or(wrapper -> wrapper.like("name", name).or().gt("age", age));
// 执行分页查询
return userMapper.selectPage(page, queryWrapper);
}
}
上述代码实现了如下功能:
- 定义了一个分页对象
Page<User>
并指定当前页码和每页大小[^1]。 - 使用
QueryWrapper
构建查询条件,并通过链式调用.like()
和.gt()
方法设置模糊匹配用户名或者年龄大于某个值的条件[^2]。 - 调用了
selectPage
方法完成分页查询。
关键点解析
分页插件配置
需要在 Spring Boot 应用程序中启用 MyBatis-Plus 的分页拦截器。通常情况下,在全局配置类中注册MybatisPlusInterceptor
即可。import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }
OR 条件的构建
在QueryWrapper
中使用.or()
方法来定义多个独立的条件分支。如果需要更清晰地表达复杂逻辑关系,还可以嵌套使用匿名函数形式的条件构造器。字段名敏感性处理
如果表中的列名为驼峰命名法(如userName
),而数据库实际存储的是下划线风格(如user_name
),则需确保开启了自动映射支持。这通常是默认开启的功能,但如果未生效,则可以在实体类上标注@TableField(value="column_name")
明确指定对应关系。
mybatisplus.or用法
MyBatis Plus 中 or
方法的使用
在构建复杂的查询条件时,QueryWrapper
提供了多种方法来组合不同的逻辑运算符。对于 or
的使用,在 QueryWrapper
类中有专门的方法用于实现 OR 逻辑连接。
基本语法结构
可以调用 or()
或者带有参数版本的重载函数来进行条件拼接:
- 不带参数的
or()
: 结束当前 AND 链条并开启新的 OR 子链。 - 带有表达式的
or(ICondition)
和or(boolean, IFunction<NoneWrapper<T>, NoneWrapper<T>> function)
: 可以直接传入 Lambda 表达式定义后续要追加的具体字段判断[^2]。
实际应用案例
下面是一个具体的例子展示如何利用 or
来创建复合查询语句:
// 创建 QueryWrapper 对象实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 添加多个条件,并通过 or 进行链接
queryWrapper.eq(User::getAge, 18).or().eq(User::getName, "Li Lei");
// 执行查询操作 (假设 userMapper 是已经配置好的 Mapper 接口)
List<User> userList = userMapper.selectList(queryWrapper);
这段代码将会生成 SQL 查询类似于 "SELECT * FROM User WHERE age = ? OR name = ?"
,其中问号会被实际值替换掉。
当需要更复杂的情况比如嵌套条件的时候,则可以通过传递 lambda 函数给 or
方法完成更加灵活的操作:
queryWrapper.eq(User::getStatus, true)
.and(i -> i.ge(User::getCreateTime, startDate))
.or(j -> j.le(User::getLastLoginTime, endDate));
这将形成如下形式的SQL片段:"...WHERE status=true AND create_time >= 'startDate' OR last_login_time <= 'endDate'".
相关推荐
















