MP条件构造器之常用功能详解(select、set)

文章目录

select

select 方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询的字段。通过调用 select 方法,可以指定在查询结果中包含哪些字段,从而实现字段级别的查询定制。

使用范围
  • QueryWrapper
  • LambdaQueryWrapper
方法签名
java 复制代码
// 设置查询字段
select(String... sqlSelect)

// 过滤查询字段(主键除外)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
参数说明
  • sqlSelect:一个字符串数组,包含要查询的字段名。
  • predicate:一个 Predicate 函数式接口,用于过滤查询字段。它接受一个 TableFieldInfo 类型的参数,并返回一个布尔值,表示是否选择该字段。
  • entityClass:实体类的类型,用于获取字段信息。
示例

假设我们有一个 User 表,其中包含字段 idusernameemail。我们希望查询 usernameemail 字段。

普通 Wrapper ( QueryWrapper)

java 复制代码
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 设置查询字段,查询 username 和 email
queryWrapper.select("username", "email");

// 执行查询,获取结果
List<User> users = userMapper.selectList(queryWrapper);

Lambda Wrapper ( LambdaQueryWrapper)

java 复制代码
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 设置查询字段,查询 username 和 email
queryWrapper.select(User::getUsername, User::getEmail);

// 执行查询,获取结果
List<User> users = userMapper.selectList(queryWrapper);

生成的 SQL 语句:

sql 复制代码
SELECT username, email FROM user;
过滤查询字段(主键除外)

假设我们希望查询字段,但排除主键字段 id

普通 Wrapper ( QueryWrapper)

java 复制代码
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 过滤查询字段,排除主键字段 id
queryWrapper.select(fieldInfo -> !"id".equals(fieldInfo.getColumn()));
// 或者直接指定查询字段排除主键
queryWrapper.select("username", "email");

// 执行查询,获取结果
List<User> users = userMapper.selectList(queryWrapper);

Lambda Wrapper ( LambdaQueryWrapper)

java 复制代码
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 过滤查询字段,排除主键字段 id
queryWrapper.select(fieldInfo -> !"id".equals(fieldInfo.getColumn()));
// 或者直接指定查询字段排除主键
queryWrapper.select(User::getUsername, User::getEmail);

// 执行查询,获取结果
List<User> users = userMapper.selectList(queryWrapper);

生成的 SQL 语句(假设主键字段是 id):

sql 复制代码
SELECT username, email FROM user;
选择特定字段并过滤字段(主键除外)

现在,我们希望根据特定的条件来选择字段,并且排除主键字段。

普通 Wrapper ( QueryWrapper)

java 复制代码
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 根据特定条件选择字段,排除主键字段 id
queryWrapper.select(fieldInfo -> {
    // 只选择 username 和 email 字段
    return "username".equals(fieldInfo.getColumn()) || "email".equals(fieldInfo.getColumn());
});

// 执行查询,获取结果
List<User> users = userMapper.selectList(queryWrapper);

Lambda Wrapper ( LambdaQueryWrapper)

java 复制代码
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 根据特定条件选择字段,排除主键字段 id
queryWrapper.select(fieldInfo -> {
    // 只选择 username 和 email 字段
    return "username".equals(fieldInfo.getColumn()) || "email".equals(fieldInfo.getColumn());
});

// 执行查询,获取结果
List<User> users = userMapper.selectList(queryWrapper);

生成的 SQL 语句:

sql 复制代码
SELECT username, email FROM user;

set

set 方法是 MyBatis-Plus 中用于构建更新操作的高级方法之一,它用于设置更新语句中的 SET 字段。通过调用 set 方法,可以指定在更新操作中要修改的字段及其新值。

使用范围
  • UpdateWrapper
  • LambdaUpdateWrapper
方法签名
java 复制代码
// 设置更新语句中的 SET 字段
set(R column, Object val)
set(R column, Object val, String mapping)
set(boolean condition, R column, Object val)
set(boolean condition, R column, Object val, String mapping)
参数说明
  • column:数据库字段名或使用 Lambda 表达式的字段名。
  • condition:一个布尔值,用于控制是否应用这个 SET 字段。
  • val:一个对象,表示要更新到字段的新值。
  • mapping:额外指定,例如: javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler
示例

假设我们有一个 Employee 表,其中包含字段 salarystatus。我们希望更新员工的 salarystatus 字段。

普通 Wrapper ( UpdateWrapper)

java 复制代码
// 创建 UpdateWrapper 实例
UpdateWrapper<Employee> updateWrapper = new UpdateWrapper<>();
// 设置更新字段,salary 更新为 5000,status 更新为 "active"
updateWrapper.set("salary", 5000).set("status", "active");

// 设置更新条件,例如更新 id 为 1 的员工
updateWrapper.eq("id", 1);

// 执行更新操作
employeeMapper.update(null, updateWrapper);

Lambda Wrapper ( LambdaUpdateWrapper)

java 复制代码
// 创建 LambdaUpdateWrapper 实例
LambdaUpdateWrapper<Employee> updateWrapper = new LambdaUpdateWrapper<>();
// 设置更新字段,salary 更新为 5000,status 更新为 "active"
updateWrapper.set(Employee::getSalary, 5000).set(Employee::getStatus, "active");

// 设置更新条件,例如更新 id 为 1 的员工
updateWrapper.eq(Employee::getId, 1);

// 执行更新操作
employeeMapper.update(null, updateWrapper);

生成的 SQL 语句:

sql 复制代码
UPDATE employee SET salary = 5000, status = 'active' WHERE id = 1;
动态根据条件设置更新字段

现在,我们希望根据动态条件来决定是否更新某些字段。例如,如果某个条件为 true,我们才更新 salary 字段。

普通 Wrapper ( UpdateWrapper)

java 复制代码
// 动态设置更新字段
boolean updateSalary = true; // 例如从外部条件中获得
boolean updateStatus = true; // 例如从外部条件中获得

// 创建 UpdateWrapper 实例
UpdateWrapper<Employee> updateWrapper = new UpdateWrapper<>();
// 根据条件动态设置更新字段
updateWrapper.set(updateSalary, "salary", 5000)
.set(updateStatus, "status", "active");

// 设置更新条件,例如更新 id 为 1 的员工
updateWrapper.eq("id", 1);

// 执行更新操作
employeeMapper.update(null, updateWrapper);

Lambda Wrapper ( LambdaUpdateWrapper)

java 复制代码
// 动态设置更新字段
boolean updateSalary = true; // 例如从外部条件中获得
boolean updateStatus = true; // 例如从外部条件中获得

// 创建 LambdaUpdateWrapper 实例
LambdaUpdateWrapper<Employee> updateWrapper = new LambdaUpdateWrapper<>();
// 根据条件动态设置更新字段
updateWrapper.set(updateSalary, Employee::getSalary, 5000)
.set(updateStatus, Employee::getStatus, "active");

// 设置更新条件,例如更新 id 为 1 的员工
updateWrapper.eq(Employee::getId, 1);

// 执行更新操作
employeeMapper.update(null, updateWrapper);

生成的 SQL 语句
如果 updateSalaryupdateStatus 都为 true,生成的 SQL 语句如下:

sql 复制代码
UPDATE employee SET salary = 5000, status = 'active' WHERE id = 1;

如果 updateSalaryfalse updateStatustrue,生成的 SQL 语句如下:**

sql 复制代码
UPDATE employee SET status = 'active' WHERE id = 1;

如果 updateSalarytrue updateStatusfalse,生成的 SQL 语句如下:**

sql 复制代码
UPDATE employee SET salary = 5000 WHERE id = 1;

如果 updateSalaryupdateStatus 都为 false,生成的 SQL 语句如下:

sql 复制代码
UPDATE employee WHERE id = 1;
使用映射设置字段

如果字段名称在数据库和对象模型中不同,我们可以使用映射名称进行更新。

普通 Wrapper ( UpdateWrapper)

java 复制代码
// 创建 UpdateWrapper 实例
UpdateWrapper<Employee> updateWrapper = new UpdateWrapper<>();
// 设置更新字段,映射名称为 "salary_field",实际字段为 "salary"
updateWrapper.set("salary_field", 5000, "salary")
.set("status_field", "active", "status");

// 设置更新条件,例如更新 id 为 1 的员工
updateWrapper.eq("id", 1);

// 执行更新操作
employeeMapper.update(null, updateWrapper);

Lambda Wrapper ( LambdaUpdateWrapper)

java 复制代码
// 创建 LambdaUpdateWrapper 实例
LambdaUpdateWrapper<Employee> updateWrapper = new LambdaUpdateWrapper<>();
// 设置更新字段,映射名称为 "salary_field",实际字段为 "salary"
updateWrapper.set(Employee::getSalary, 5000, "salary_field")
.set(Employee::getStatus, "active", "status_field");

// 设置更新条件,例如更新 id 为 1 的员工
updateWrapper.eq(Employee::getId, 1);

// 执行更新操作
employeeMapper.update(null, updateWrapper);

生成的 SQL 语句:

sql 复制代码
UPDATE employee SET salary = 5000, status = 'active' WHERE id = 1;
更多功能详解

https://baomidou.com/guides/wrapper/#功能详解

相关推荐
zzzll11111 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
vx-Biye_Design6 小时前
SSM伴侣动物伴护星小程序06330-计算机课程设计、毕业设计
spring boot·后端·elasticsearch·小程序·架构·课程设计·idea
前端精髓13 小时前
NestJS 是什么(对着 Spring Boot 一起学习)
spring boot·后端·学习
武哥聊编程15 小时前
【AI实战项目】基于SpringAI+Springboot+Vue的AI面试刷题训练平台
vue.js·人工智能·spring boot·springai
vipxieliang15 小时前
固定电话验证详解:区号、号码、分机号的完整验证
java·spring boot
步行cgn16 小时前
Spring Boot 主入口类上的 @Enable 和 @Scan 注解详解
java·spring boot·后端
xixingzhe216 小时前
SpringBoot DDD 实战入门文档
spring boot·spring·ddd
杨运交18 小时前
[069][公共模块]Spring Boot 全局异常处理与参数校验实战(下):校验异常精细化处理与 WebFlux 适配
java·spring boot·后端
行者-全栈开发19 小时前
Spring Boot + FFmpeg 视频批量处理实战:压缩、HLS切片与异步任务引擎
spring boot·ffmpeg·异步处理·视频压缩·hls切片·批量任务·redis队列
Andya_net19 小时前
Spring Boot | 条件注解完全指南:从 @Conditional 到 @ConditionalOnExpression 的原理、实践与避坑
spring boot·后端·python