JPA之update操作 --save()方法更新部分字段,不更新的字段为null的解决办法

问题:修改更新数据库部分字段,用save()方法进行update操作,未修改字段默认为null。

User表有username,id,phone,email,password字段,只修改usernam和phone,

修改操作:

1.拿到前端传递的实体user;

2.根据user的userId,拿到原始的对象(修改前的user对象);

Long userId = user.getUserId();  //获取userId
User oldUser = userDao.findByUserId(userId); //根据userId得到修改前原user对象

3.将前端传递过来的不为空的参数,也就是要修改的值copy复制来覆盖原始对象

UpdateUtil.copyNullProperties(user,oldUser);

解决方法:写一个工具类,筛选出前端传递过来要修改的实体user中为null的字段,然后将不为空的参数(也就是要修改的参数覆盖原来数据库中修改前的参数)(也就是要修改的进行修改,不修改的保持不变)。

1.工具类:UpdateUtil.java

/**
 * 更新工具类(忽略为null的字段)
 */
public class UpdateUtil {

  /**
   * 所有为空值的属性都不copy
   * @param source
   * @param target
   */
  public static void copyNullProperties(Object source, Object target) {
    BeanUtils.copyProperties(source, target, getNullField(source));
  }

  /**
   * 获取属性中为空的字段
   *
   * @param target
   * @return
   */
  private static String[] getNullField(Object target) {
    BeanWrapper beanWrapper = new BeanWrapperImpl(target);
    PropertyDescriptor[] propertyDescriptors = beanWrapper.getPropertyDescriptors();
    Set notNullFieldSet = new HashSet<>();
    if (propertyDescriptors.length > 0) {
      for (PropertyDescriptor p : propertyDescriptors) {
        String name = p.getName();
        Object value = beanWrapper.getPropertyValue(name);
        if (Objects.isNull(value)) {
          notNullFieldSet.add(name);
        }
      }
    }
    String[] notNullField = new String[notNullFieldSet.size()];
    return notNullFieldSet.toArray(notNullField);
  }
}

2.UserService.java

  public void updateUser(User user)  //前端传递user实体
    {
        Long userId = user.getUserId();

        User oldUser = userDao.findByUserId(userId);  //根据userId找到原user实体

        if (StringUtils.isNotNull(oldUser)){   //如果oldUser不为空

            //将前端传来的不为空参数(也即是要修改值)copy覆盖原始对象属性值

            UpdateUtil.copyNullProperties(user,oldUser);  //修改的字段覆盖原对象
        }
        
        userDao.save(oldUser); //更新到数据库
    }

3.数据层:UserDao.java

@Repository
public interface UserDao extends JpaRepository {}

参考链接:https://www.zhangshengrong.com/p/Z9a23QbzNV/

你可能感兴趣的:(JPA之update操作 --save()方法更新部分字段,不更新的字段为null的解决办法)