Mybatis-Plus updateById方法更新无效及空值处理过程
目录
- 1. 使用UpdateWrapper并设置setSqlSelect
- 2. 使用LambdaUpdateWrapper并调用set方法
- 3. 全局配置允许更新空值
- 4. 使用UpdateStrategy注解
- 5. 检查实体类的属性和数据库字段映射
- 6. 确认事务是否生效
- 总结
在使用 MyBATis-Plus 进行数据持久化操作时,updateById 方法默认不会更新字段的空值(null)。
这是因为 Mybatis-Plus 为了防止误操作,避免将数据库中原本存在的非空字段更新为 nulhttp://www.devze.coml。然而,在某些业务场景下,我们可能需要允许更新空值。
以下是几种解决 updateById 方法不更新空值或更新字段无效问题的方法:
1. 使用UpdateWrapper并设置setSqlSelect
通过 UpdateWrapper 可以灵活地控制更新的字段,包括允许更新为 null。
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
// 假设有一个实体类 User
User user = new User();
user.setId(1); // 需要更新的记录ID
user.setName(null); // 需要更新为空的字段
user.setAge(30);
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", user.getId())
.set("name", user.getName()) // 允许 name 字段更新为 null
.set("age", user.getAge());
int rows = userMapper.update(null, updateWrapper);
System.out.println("受影响的行数: " + rows);
2. 使用LambdaUpdateWrapper并调用set方法
LambdaUpdateWrapper 提供了类型安全的更新方式,同样可以设置字段为 null。
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
User user = new User();
user.setId(1);
user.setName(null); // 需要更新为空的字段
user.setAge(30);
LambdaUpdateWrapper<User> lambdandroidaUpdate = new LambdaUpdateWrapper<>();
lambdaUpdate.eq(User::getId, user.getId())
.set(User::getName, user.getName()) // 允许 name 字段更新为 null
.set(User::getAge, user.getAge());
int rows = userMapper.update(null, lambdaUpdate);
System.out.println("受影响的行数: " + rows);
3. 全局配置允许更新空值javascript
如果项目中多处需要更新空值,可以在 Mybatis-Plus 的全局配置中开启 updateStrategy,允许字段更新为 null。
mybatis-plus:
global-config:
db-config:
update-strategy: not_null # 默认值,可以设置为 'ignore' 以允许更新 null
或者在代码中进行配置:
import com.baomidou.mybatisplus.annotation.DbConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomid编程ou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 其他拦截器配置
return interceptor;
}
@Bean
public DbConfig dbConfig() {
return new DbConfig();
}
}
注意:全局配置会影响所有的更新操作,需谨慎使用。
4. 使用UpdateStrategy注解
在实体类的字段上使用 @TableField 注解,并设置 updateStrategy 为 FieldStrategy.IGNORED,以允许该字段在更新时接受 null 值。
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
public class User {
private Long id;
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String name; // 允许更新为 null
private Integer age;
// getters and setters
}
5. 检查实体类的属性和数据库字段映射
确保实体类中的属性名称与数据库表中的字段名称一致,且类型匹配。
如果存在不一致,可能导致更新无效。
6. 确认事务是否生效
如果在一个事务中进行更新操作,确保事务已正确提交。
未提交的事务不会对数据库产生影响。
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Transactional
public void updateUser(User user) {
userMapper.updateById(user);
}
}
总结
updateById 方法默认不更新空值是为了防止误操作。
如果确实需要更新空值,可以通过以下几种方式实现:
- 使用
UpdateWrapper或LambdaUpdateWrapper并显式设置需要更新的字段为null。 - 在全局配置中调整javascript更新策略(需谨慎)。
- 在实体类字段上使用注解
@TableField并设置updateStrategy为IGNORED。 - 确认实体类与数据库字段的映射关系以及事务的正确性。
根据具体的业务需求选择合适的方法,以确保数据更新操作符合预期。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
加载中,请稍侯......
精彩评论