修改工具类

关于修改的工具类

原理:前端取到一个对象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();
        }
    }
上一篇:java.lang.Class阅读笔记


下一篇:寒假每日一题打卡day24——AcWing 703. 数独检查