JAVA比较两个实体类的属性变化并生成记录

工具类 GetChangeDateUtil

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class GetChangeDateUtil {
	/**
	 * 
	 * <p>Title: compareFields</p>  
	 * <p>Description: </p>  比较两个实体属性值
	 * @param obj1
	 * @param obj2
	 * @param ignoreArr 忽略的字段
	 * @return  
	 */
	 public static Map<String, List<Object>> compareFields(Object obj1, Object obj2, String[] ignoreArr) {  
	        try{  
	            Map<String, List<Object>> map = new HashMap<String, List<Object>>();  
	            List<String> ignoreList = null;  
	            if(ignoreArr != null && ignoreArr.length > 0){  
	                // array转化为list  
	                ignoreList = Arrays.asList(ignoreArr);  
	            }  
	            if (obj1.getClass() == obj2.getClass()) {// 只有两个对象都是同一类型的才有可比性  
	                Class clazz = obj1.getClass();  
	                // 获取object的属性描述  
	                PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,  
	                        Object.class).getPropertyDescriptors();  
	                for (PropertyDescriptor pd : pds) {// 这里就是所有的属性了  
	                    String name = pd.getName();// 属性名  
	                    if(ignoreList != null && ignoreList.contains(name)){// 如果当前属性选择忽略比较,跳到下一次循环  
	                        continue;  
	                    }  
	                    Method readMethod = pd.getReadMethod();// get方法  
	                    // 在obj1上调用get方法等同于获得obj1的属性值  
	                    Object o1 = readMethod.invoke(obj1);  
	                    // 在obj2上调用get方法等同于获得obj2的属性值  
	                    Object o2 = readMethod.invoke(obj2);  
	                    if(o1 instanceof Timestamp){  
	                        o1 = new Date(((Timestamp) o1).getTime());  
	                    }  
	                    if(o2 instanceof Timestamp){  
	                        o2 = new Date(((Timestamp) o2).getTime());  
	                    }  
	                    if(o1 == null && o2 == null){                               //o1 旧     o2新    如果两个都是空就跳过
	                        continue;  
	                    }else if(o1 == null && o2 != null){                         //如果O1旧的没有     O2新的有      
	                        List<Object> list = new ArrayList<Object>();  
	                        list.add("旧()");  
	                        list.add("新"+"("+MyUtil.deUnicode(String.valueOf(o2))+")");  
	                        map.put(name, list);  
	                        continue;  
	                    }  
	                    if (!o1.equals(o2)) {// 比较这两个值是否相等,不等就可以放入map了                             //如果旧的和新的不相等
	                        List<Object> list = new ArrayList<Object>();  
	                        if(o1==null) {
	                        	list.add("旧()");
	                        }else {
	                        	list.add("旧"+"("+MyUtil.deUnicode(String.valueOf(o1))+")");
	                        }
                            if(o2==null) {
                            	list.add("新()");
                            }else {
	                        	list.add("新"+"("+MyUtil.deUnicode(String.valueOf(o2))+")");  
                            }
	                        map.put(name, list);  
	                    }  
	                }  
	            }  
	            return map;  
	        }catch(Exception e){  
	            e.printStackTrace();  
	            return null;  
	        }  
	    }  

}

代码引用

 String arr[]= {"这里放忽略对比的字段 注意是实体类中的名称"};
 System.out.println(GetChangeDateUtil.compareFields(旧的实体类,新的实体类,arr));

效果

{person_n1=[旧(), 新(4444)]}

上面只是作为两个实体类的对比,并且最后一并显示出有差别的字段和新旧两个数据
如果想再进一步,如果我想把person_n1的两个值分别拿出来

Map<String, List<Object>> bject = GetChangeDateUtil.compareFields(旧的实体类,新的实体类,arr);
 List<Object> aa=bject.get("person_n1");
        //  for (int i = 0; i < aa.size(); i++) {
		//			System.out.println(aa.get(i));
		//		}    
		//用for循环好像没必要了,直接取数据,因为我们只有两个对比值
		System.out.println("person_n1由"+aa.get(0)+"修改为"+aa.get(1));

效果

// 旧()
// 新(555)
person_n1由旧()修改为新(4444)      //再把工具类中的  旧 和 新 删除
person_n1由()修改为(4444) 

如果有多个字段修改了,想生成一段修改记录

  System.out.println(GetChangeDateUtil.compareFields(旧的实体类,新的实体类,arr));
  
 Map<String, List<Object>> bject = GetChangeDateUtil.compareFields(旧的实体类,新的实体类,arr);
				  List<Map<String,List<Object>>> list = new ArrayList<Map<String, List<Object>>>();  
                  list.add(bject);
                  for (Map<String,List<Object>> m : list)  
                  {  
                    for (String k : m.keySet())  
                    {  
                      List<Object> aa=bject.get(k);
                      System.out.println(k+"由"+aa.get(0)+"修改为"+aa.get(1));
                    }   
                  }  
				  

效果

{person_p1=[旧(30), 新(30555)], person_n1=[旧(), 新(4444)]}

person_p1由旧(30)修改为新(30555)
person_n1由旧()修改为新(4444)

最终大家可以自己拼接成字符串,生成修改记录

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值