|
在MyBatis-Plus中,update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper)方法用于根据条件构造器动态更新数据,其核心逻辑如下:
1. 方法定义解析
int update(
@Param(Constants.ENTITY) T entity, // 实体对象(设置更新的字段值)
@Param(Constants.WRAPPER) Wrapper<T> wrapper // 条件构造器(WHERE子句)
);
返回值:受影响的行数(int),0表示更新失败。
参数:
entity:提供需更新的字段值(非null字段默认参与更新);
wrapper:通过UpdateWrapper或LambdaUpdateWrapper构建更新条件。
2. 使用示例
场景一:更新实体字段 + 条件构造器
User user = new User();
user.setName("张三"); // 设置更新字段
user.setAge(25);
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("id", 1); // 条件:id=1
int rows = userMapper.update(user, wrapper);
// 生成SQL:UPDATE user SET name='张三', age=25 WHERE id=1
说明:entity中非null字段会被更新,wrapper指定WHERE条件。
场景二:纯条件更新(不构造实体对象)
UpdateWrapper<User> wrapper = new UpdateWrapper<>();
wrapper.eq("status", 0)
.set("status", 1); // 直接通过wrapper.set更新字段
int rows = userMapper.update(null, wrapper);
// 生成SQL:UPDATE user SET status=1 WHERE status=0
优势:避免创建实体对象,适合少量字段更新。
场景三:Lambda条件构造器
LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(User::getId, 1)
.set(User::getEmail, "new@example.com");
int rows = userMapper.update(null, wrapper);
// 生成SQL:UPDATE user SET email='new@example.com' WHERE id=1
特点:类型安全,避免硬编码字段名。
3. 注意事项
字段更新策略
默认忽略entity中的null字段,可通过注解强制更新:
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String name; // 即使为null也会更新
条件冲突
若entity的主键字段有值,可能与wrapper条件冲突,建议优先使用wrapper明确条件。
批量更新
需结合wrapper.in()实现批量条件更新,而非直接传集合参数。
|
|