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/