Mybatis-Plus updateById 方法更新无效及空值处理

打印 上一主题 下一主题

主题 855|帖子 855|积分 2565

在利用 Mybatis-Plus 进行数据恒久化操纵时,updateById 方法默认不会更新字段的空值(null)。这是由于 Mybatis-Plus 为了防止误操纵,制止将数据库中本来存在的非空字段更新为 null。然而,在某些业务场景下,我们大概必要允许更新空值。以下是几种解决 updateById 方法不更新空值或更新字段无效题目的方法:
1. 利用 UpdateWrapper 并设置 setSqlSelect

通过 UpdateWrapper 可以灵活地控制更新的字段,包罗允许更新为 null。
  1. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  2. // 假设有一个实体类 User
  3. User user = new User();
  4. user.setId(1); // 需要更新的记录ID
  5. user.setName(null); // 需要更新为空的字段
  6. user.setAge(30);
  7. UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
  8. updateWrapper.eq("id", user.getId())
  9.              .set("name", user.getName()) // 允许 name 字段更新为 null
  10.              .set("age", user.getAge());
  11. int rows = userMapper.update(null, updateWrapper);
  12. System.out.println("受影响的行数: " + rows);
复制代码
2. 利用 LambdaUpdateWrapper 并调用 set 方法

LambdaUpdateWrapper 提供了类型安全的更新方式,同样可以设置字段为 null。
  1. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  2. User user = new User();
  3. user.setId(1);
  4. user.setName(null); // 需要更新为空的字段
  5. user.setAge(30);
  6. LambdaUpdateWrapper<User> lambdaUpdate = new LambdaUpdateWrapper<>();
  7. lambdaUpdate.eq(User::getId, user.getId())
  8.            .set(User::getName, user.getName()) // 允许 name 字段更新为 null
  9.            .set(User::getAge, user.getAge());
  10. int rows = userMapper.update(null, lambdaUpdate);
  11. System.out.println("受影响的行数: " + rows);
复制代码
3. 全局配置允许更新空值

如果项目中多处必要更新空值,可以在 Mybatis-Plus 的全局配置中开启 updateStrategy,允许字段更新为 null。
  1. mybatis-plus:
  2.   global-config:
  3.     db-config:
  4.       update-strategy: not_null # 默认值,可以设置为 'ignore' 以允许更新 null
复制代码
大概在代码中进行配置:
  1. import com.baomidou.mybatisplus.annotation.DbConfig;
  2. import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  3. import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. @Configuration
  7. public class MybatisPlusConfig {
  8.     @Bean
  9.     public MybatisPlusInterceptor mybatisPlusInterceptor() {
  10.         MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  11.         // 其他拦截器配置
  12.         return interceptor;
  13.     }
  14.     @Bean
  15.     public DbConfig dbConfig() {
  16.         return new DbConfig();
  17.     }
  18. }
复制代码
注意:全局配置会影响全部的更新操纵,需审慎利用。
4. 利用 UpdateStrategy 注解

在实体类的字段上利用 @TableField 注解,并设置 updateStrategy 为 FieldStrategy.IGNORED,以允许该字段在更新时接受 null 值。
  1. import com.baomidou.mybatisplus.annotation.FieldStrategy;
  2. import com.baomidou.mybatisplus.annotation.TableField;
  3. public class User {
  4.    
  5.     private Long id;
  6.    
  7.     @TableField(updateStrategy = FieldStrategy.IGNORED)
  8.     private String name; // 允许更新为 null
  9.    
  10.     private Integer age;
  11.     // getters and setters
  12. }
复制代码
5. 查抄实体类的属性和数据库字段映射

确保实体类中的属性名称与数据库表中的字段名称一致,且类型匹配。如果存在不一致,大概导致更新无效。
6. 确认事务是否生效

如果在一个事务中进行更新操纵,确保事务已准确提交。未提交的事务不会对数据库产生影响。
  1. import org.springframework.transaction.annotation.Transactional;
  2. @Service
  3. public class UserService {
  4.     @Transactional
  5.     public void updateUser(User user) {
  6.         userMapper.updateById(user);
  7.     }
  8. }
复制代码
总结

updateById 方法默认不更新空值是为了防止误操纵。如果确实必要更新空值,可以通过以下几种方式实现:

  • 利用 UpdateWrapper 或 LambdaUpdateWrapper 并显式设置必要更新的字段为 null。
  • 在全局配置中调解更新策略(需审慎)。
  • 在实体类字段上利用注解 @TableField 并设置 updateStrategy 为 IGNORED。
  • 确认实体类与数据库字段的映射关系以及事务的准确性。
根据具体的业务需求选择合适的方法,以确保数据更新操纵符合预期。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表