select
select
方法是 MyBatis-Plus 中用于构建查询条件的高级方法之一,它用于设置查询的字段。通过调用 select
方法,可以指定在查询结果中包含哪些字段,从而实现字段级别的查询定制。
使用范围
QueryWrapper
LambdaQueryWrapper
方法签名
// 设置查询字段
select(String... sqlSelect)
// 过滤查询字段(主键除外)
select(Predicate<TableFieldInfo> predicate)
select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
参数说明
sqlSelect
:一个字符串数组,包含要查询的字段名。predicate
:一个Predicate
函数式接口,用于过滤查询字段。它接受一个TableFieldInfo
类型的参数,并返回一个布尔值,表示是否选择该字段。entityClass
:实体类的类型,用于获取字段信息。
示例
假设我们有一个 User
表,其中包含字段 id
、username
和 email
。我们希望查询 username
和 email
字段。
普通 Wrapper (QueryWrapper
):
// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 设置查询字段,查询 username 和 email
queryWrapper.select("username", "email");
// 执行查询,获取结果
List<User> users = userMapper.selectList(queryWrapper);
Lambda Wrapper (LambdaQueryWrapper
):
// 创建 LambdaQueryWrapper 实例
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 设置查询字段,查询 username 和 email
queryWrapper.select(User::getUsername, User::getEmail);
// 执行查询,获取结果
List<User> users = userMapper.selectList(queryWrapper);
生成的 SQL 语句:
SELECT username, email FROM user;
过滤查询字段(主键除外)
假设我们希望查询字段,但排除主键字段 id
。
普通 Wrapper (QueryWrapper
):
// 创建 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
):
// 创建 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
):
SELECT username, email FROM user;
选择特定字段并过滤字段(主键除外)
现在,我们希望根据特定的条件来选择字段,并且排除主键字段。
普通 Wrapper (QueryWrapper
):
// 创建 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
):
// 创建 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 语句:
SELECT username, email FROM user;
set
set
方法是 MyBatis-Plus 中用于构建更新操作的高级方法之一,它用于设置更新语句中的 SET 字段。通过调用 set
方法,可以指定在更新操作中要修改的字段及其新值。
使用范围
UpdateWrapper
LambdaUpdateWrapper
-
方法签名
// 设置更新语句中的 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
表,其中包含字段 salary
和 status
。我们希望更新员工的 salary
和 status
字段。
普通 Wrapper (UpdateWrapper
):
// 创建 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
):
// 创建 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 语句:
UPDATE employee SET salary = 5000, status = 'active' WHERE id = 1;
动态根据条件设置更新字段
现在,我们希望根据动态条件来决定是否更新某些字段。例如,如果某个条件为 true
,我们才更新 salary
字段。
普通 Wrapper (UpdateWrapper
):
// 动态设置更新字段
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
):
// 动态设置更新字段
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 语句:
如果 updateSalary
和 updateStatus
都为 true
,生成的 SQL 语句如下:
UPDATE employee SET salary = 5000, status = 'active' WHERE id = 1;
如果 updateSalary
为 false
,updateStatus
为 true
,生成的 SQL 语句如下:**
UPDATE employee SET status = 'active' WHERE id = 1;
如果 updateSalary
为 true
,updateStatus
为 false
,生成的 SQL 语句如下:**
UPDATE employee SET salary = 5000 WHERE id = 1;
如果 updateSalary
和 updateStatus
都为 false
,生成的 SQL 语句如下:
UPDATE employee WHERE id = 1;
使用映射设置字段
如果字段名称在数据库和对象模型中不同,我们可以使用映射名称进行更新。
普通 Wrapper (UpdateWrapper
):
// 创建 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
):
// 创建 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 语句:
UPDATE employee SET salary = 5000, status = 'active' WHERE id = 1;
更多功能详解
https://baomidou.com/guides/wrapper/#%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3