Java实体类对象修改日志记录
生活随笔
收集整理的這篇文章主要介紹了
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 返回經過更新后的數據*/@Overridepublic <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);//通過注解獲取tableNameTable 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;}
轉載于:https://www.cnblogs.com/panlongfeng/p/9564072.html
總結
以上是生活随笔為你收集整理的Java实体类对象修改日志记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 发布至今18年,为什么SQLite一定要
- 下一篇: Jenkins - Extended E