Java實體類對象修改日志記錄


比較對象類

import org.springframework.beans.BeanUtils;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 對比兩個對象的差值
 * Created by Administrator on 2018/7/9.
 */
public class CompareObejct<T> {

    private T original;    

    private T current;

    /**
     *
     * @param cls
     * @return
     */
    public String contrastObj(Class<T> cls){
        StringBuilder sb = new StringBuilder();
        try{
            Field[] fields = cls.getDeclaredFields();
            for(Field field: fields){
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(),cls);
                Method getMethod = pd.getReadMethod();
                String type = field.getType().getName();
                if(!"java.util.Set".equals(type)){
                    Object o1 = getMethod.invoke(this.original);
                    Object o2 = getMethod.invoke(this.current);
                    if(null != o2){
                        String s1 = o1 == null ? "" :o1.toString();
                        String s2 = o2 == null ? "" :o2.toString();
                        if(!s1.equals(s2)){
                            //System.out.println("不一樣的屬性:" + field.getName() + " 屬性值:[" + s1 + "," + s2 + "]");
                            sb.append(field.getName() + ":" + "[" + s1 + "," + s2 + "];");
                        }
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return sb.toString();
    }


    public T getOriginal() {
        return original;
    }

    public void setOriginal(T original) {
        this.original = original;
    }

    public T getCurrent() {
        return current;
    }

    public void setCurrent(T current) {
        this.current = current;
    }
}

  將要修改的值組合成一個新的實體類的JavaBean,得到差異內容后進行復制得到更新后的對象:

/**
	 * 復制對象屬性(對象類型必須相同)
	 *
	 * @param orig 資源對象
	 * @param dest 目標對象
	 * @param clazz 源對象類
	 * @param ignoreNull 是否忽略空(true:忽略,false:不忽略)
	 * @param ignoreExist  是否只復制dest值為空的數據  true 是,false 否
	 * @return
	 */
	public static <T> T copyProperties(T orig, T dest, Class<?> clazz, boolean ignoreNull,boolean ignoreExist) {
		if (orig == null || dest == null)
			return null;
		if(!clazz.isAssignableFrom(orig.getClass()))
			return null;
		Field[] fields = clazz.getDeclaredFields();
		for (Field field : fields) {
			try {
				field.setAccessible(true);
				Object value = field.get(orig);
				Object value2 = field.get(dest);
				System.out.println(field + "----" + value2);
				if(!java.lang.reflect.Modifier.isFinal(field.getModifiers())){
					if(!(ignoreNull && value == null)){
						if(ignoreExist && value2 != null){

						}else{
							field.set(dest, value);
						}

					}

				}
				field.setAccessible(false);
			} catch (Exception e) {
			}
		}

		if(clazz.getSuperclass() == Object.class){
			return dest;
		}

		return copyProperties(orig, dest, clazz.getSuperclass(), ignoreNull,ignoreExist);
	}

  調用示例:

 /**
     * * 記錄修改數據的日志
     * * @Param
     * * Class<T> c 修改對應的實體類
     * * T old 修改前的數據
     * * T update 修改的值(通過JSON轉換為bean)
     * * @rerturn 返回經過更新后的數據
     */
    @Override
    public <T> T saveUpdateLog(Class<T> c, T old, T update) {
        try {
            TUpdateLog updateLog = new TUpdateLog();
            CompareObejct<T> compareObejct = new CompareObejct<T>();
            compareObejct.setOriginal(old);
            compareObejct.setCurrent(update);
            String updateContrast = compareObejct.contrastObj(c);
            if (!JiuyiUtil.isEmpty(updateContrast)) {
                updateLog.setUpdateContrast(updateContrast);
                //通過注解獲取tableName
                Table annotation = c.getAnnotation(Table.class);
                String tableName = annotation.name();
                updateLog.setTableName(tableName);
                updateLog.setBeforeUpdateEntity(JSON.toJSONString(old));
                JiuyiUtil.copyProperties(old, update, false, true);
                updateLog.setAfterUpdateEntity(JSON.toJSONString(update));
                updateLogDao.save(updateLog);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return update;
    }

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM