mybatisplus按条件修改实体单个字段实现方式
作者:qq_36608622
在MyBatis-Plus中,可以使用UpdateWrapper/LambdaUpdateWrapper按条件修改实体单个字段,推荐使用LambdaUpdateWrapper,它具有类型安全、清晰、高效等优点,避免使用updateById()或传入实体对象的方式,通过示例展示如何正确使用UpdateWrapper进行单个字段的更新
mybatisplus按条件修改实体单个字段
在 MyBatis-Plus 中,按条件修改单个字段(而不是整条记录),不要使用 updateById() 或传入实体对象的方式,而应使用 UpdateWrapper / LambdaUpdateWrapper 显式指定要更新的字段和条件。
推荐方式
使用 LambdaUpdateWrapper(类型安全、清晰、高效)
场景示例
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
// 方式1:通过 Service 调用(推荐)
boolean success = userService.update(
Wrappers.<User>lambdaUpdate()
.set(User::getStatus, "ACTIVE") // 只更新 status 字段
.eq(User::getId, 1001) // WHERE 条件:id = 1001
);
// 生成的 SQL:
UPDATE user SET status = 'ACTIVE' WHERE id = 1001;
其他常见用法
// 1. 多条件 + 单字段更新
userService.update(
Wrappers.<User>lambdaUpdate()
.set(User::getStatus, "INACTIVE")
.eq(User::getAge, 18)
.likeRight(User::getName, "张") // name LIKE '张%'
.gt(User::getCreateTime, LocalDateTime.now().minusDays(7))
);
// 2. 使用 SQL 表达式(如自增、函数),setSql() 是直接拼接 SQL,确保值安全(避免 SQL 注入)。
// status = status + 1(适用于数值字段)
userService.update(
Wrappers.<User>lambdaUpdate()
.setSql("login_count = login_count + 1") // 注意:用 setSql()
.eq(User::getId, 1001)
);
// 3. 仅使用 Mapper(不通过 Service)
@Autowired
private UserMapper userMapper;
userMapper.update(null,
Wrappers.<User>lambdaUpdate()
.set(User::getStatus, "LOCKED")
.eq(User::getUsername, "admin")
);
// 第一个参数传 null,表示不使用实体对象,完全依赖 Wrapper。常见错误(务必避免)

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
