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

相关推荐
罗政2 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
Java小白笔记5 小时前
关于使用Mybatis-Plus 自动填充功能失效问题
spring boot·后端·mybatis
小哇6666 小时前
Spring Boot,在应用程序启动后执行某些 SQL 语句
数据库·spring boot·sql
luoluoal8 小时前
java项目之企业级工位管理系统源码(springboot)
java·开发语言·spring boot
蜜桃小阿雯8 小时前
JAVA开源项目 校园美食分享平台 计算机毕业设计
java·jvm·spring boot·spring cloud·intellij-idea·美食
计算机学姐9 小时前
基于SpringBoot+Vue的篮球馆会员信息管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis
程序员大金9 小时前
基于SpringBoot+Vue+MySQL的智能物流管理系统
java·javascript·vue.js·spring boot·后端·mysql·mybatis
customer0812 小时前
【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
Flying_Fish_roe12 小时前
Spring Boot-版本兼容性问题
java·spring boot·后端
尘浮生15 小时前
Java项目实战II基于Java+Spring Boot+MySQL的大学城水电管理系统(源码+数据库+文档)
java·开发语言·数据库·spring boot·后端·mysql·maven