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/#功能详解

相关推荐
JH30736 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
qq_12498707539 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_9 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
2301_818732069 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea
汤姆yu13 小时前
基于springboot的尿毒症健康管理系统
java·spring boot·后端
暮色妖娆丶13 小时前
Spring 源码分析 单例 Bean 的创建过程
spring boot·后端·spring
biyezuopinvip14 小时前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
JavaGuide14 小时前
一款悄然崛起的国产规则引擎,让业务编排效率提升 10 倍!
java·spring boot
figo10tf15 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
zhangyi_viva15 小时前
Spring Boot(七):Swagger 接口文档
java·spring boot·后端