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 {

private T original;

private T current;

/**

*

* @param cls

* @return

*/

public String contrastObj(Class 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 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 c 修改对应的实体类

* * T old 修改前的数据

* * T update 修改的值(通过JSON转换为bean)

* * @rerturn 返回经过更新后的数据

*/

@Override

public T saveUpdateLog(Class c, T old, T update) {

try {

TUpdateLog updateLog = new TUpdateLog();

CompareObejct compareObejct = new CompareObejct();

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值