关于修改的工具类

原理:前端取到一个对象1,再从数据库中调出一个对象2,对象1与对象2相互比较,1中没有的数据由2给与,1中原有的数据保留,成功实现修改功能。

package com.sddc.util;

import org.springframework.context.ConfigurableApplicationContext;

import java.lang.reflect.Method;
import java.util.Collection;

public class BeanUtil {
//将管理上下文的applicationContext设置成静态变量,供全局调用
public static ConfigurableApplicationContext applicationContext;
//定义一个获取已经实例化bean的方法
public static <T> T getBean(Class<T> c){
return applicationContext.getBean(c);
}

/**
* 复制对象属性:只复制需要的属性值,目标对象中原来的值不变
* 只适用于2个相同对象
* @param from 要复制的对象
* @param to 目标对象
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static void copyPropertiesExclude(Object from, Object to) throws Exception {
if(!from.getClass().equals(to.getClass())){
throw new RuntimeException("对象不是同一类型,fromClass:"+from.getClass()+",toClass:"+to.getClass());
}
Method[] fromMethods = from.getClass().getDeclaredMethods();
Method[] toMethods = to.getClass().getDeclaredMethods();
Method fromMethod = null, toMethod = null;
String fromMethodName = null, toMethodName = null;
for (int i = 0; i < fromMethods.length; i++) {
fromMethod = fromMethods[i];
fromMethodName = fromMethod.getName();
if (!fromMethodName.contains("get")) {
continue;
}
toMethodName = "set" + fromMethodName.substring(3);
toMethod = findMethodByName(toMethods, toMethodName);


//如果方法为null,不处理
if (toMethod == null) {
continue;
}

Object value = fromMethod.invoke(from, new Object[0]);
Object tovalue = toMethods[i].invoke(to, new Object[0]);

//如果目标对象的值不为空,不处理
if(tovalue != null) {
continue;
}

//如果值为空,不处理
if(value == null) {
continue;
}

//集合类判空处理
if(value instanceof Collection) {
Collection newValue = (Collection)value;
if(newValue.size() <= 0)
continue;
}
toMethod.invoke(to, new Object[] {value});
}
}

/**
* 从方法数组中获取指定名称的方法
*
* @param methods
* @param name
* @return
*/
public static Method findMethodByName(Method[] methods, String name) {
for (int j = 0; j < methods.length; j++) {
if (methods[j].getName().equals(name))
return methods[j];
}
return null;
}
}


再由service接口调用工具类,最终实现修改数据的功能

@Override
public void update(ProjectInfo projectInfo) {
ProjectInfo p = projectInfoDao.findOneById(projectInfo.getId());
p.setUpdateTime(new Date());
try {
BeanUtil.copyPropertiesExclude(p,projectInfo);
projectInfoDao.save(projectInfo);
} catch (Exception e) {
e.printStackTrace();
}
}