在开发时,我们可能会遇到这样一个问题,就是前端传过来是表中的部分字段,如果用这个对象直接update就会导致数据库中我们不想被更新掉的数据,被更新为null了。
显然,这样的跟新并不是我们想要的结果。
解决方案一:
使用ifelse一个一个判断,这样的效率很低,而且有太多冗余的代码。
这个方法在此不做赘述。
解决方案二:
使用反射将前端传过来的数据,和查找出数据库中的数据,使用反射将该更新的数据更新。
/**
* 解决更新时,源对象被覆盖
* @param src 数据库查出的源对象数据
* @param desc 前端传的需要更新的数据
* @return 更新后的对象
* @throws Exception 源对象与目标对象类型不一致
*/
public static Object updateBean(Object src,Object desc) throws Exception {
Class<?> srcClass = src.getClass();
Class<?> descClass = desc.getClass();
if(!descClass.equals(srcClass)){
throw new Exception("源对象与目标对象类型不一致!");
}
Field[] srcClassFields = srcClass.getDeclaredFields();
Field[] descClassFields = descClass.getDeclaredFields();
for (int i = 0; i < descClassFields.length; i++) {
descClassFields[i].setAccessible(true);
Object o = descClassFields[i].get(desc);
if(o != null && !"".equals(o.toString().trim())){
srcClassFields[i].setAccessible(true);
srcClassFields[i].set(src, o);
}
}
return src;
}
1.首先获得两个对象的所有方法
2.遍历目标对象的所有get方法,如果有值,则获取源对象的set方法