比较两个实体类是否一致utils

比较两个实体类是否一致utils:

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

public class ClassCompareUtil {

    /**
     * 比较两个实体属性值,返回一个boolean,true则表时两个对象中的属性值无差异
     * @param oldObject 进行属性比较的对象1
     * @param newObject 进行属性比较的对象2
     * @return 属性差异比较结果boolean
     */
    public static boolean compareObject(Object oldObject, Object newObject) {
        Map<String, Map<String,Object>> resultMap=compareFields(oldObject,newObject);

        if(resultMap.size()>0) {
            return true;
        }else {
            return false;
        }
    }

    /**
     * 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值
     * @param oldObject 进行属性比较的对象1
     * @param newObject 进行属性比较的对象2
     * @return 属性差异比较结果map
     */
    @SuppressWarnings("rawtypes")
    public static Map<String, Map<String,Object>> compareFields(Object oldObject, Object newObject) {
        Map<String, Map<String, Object>> map = null;

        try{
            /**
             * 只有两个对象都是同一类型的才有可比性
             */
            if (oldObject.getClass() == newObject.getClass()) {
                map = new HashMap<String, Map<String,Object>>();

                Class clazz = oldObject.getClass();
                //获取object的所有属性
                PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,Object.class).getPropertyDescriptors();

                for (PropertyDescriptor pd : pds) {
                    //遍历获取属性名
                    String name = pd.getName();

                    //获取属性的get方法
                    Method readMethod = pd.getReadMethod();

                    // 在oldObject上调用get方法等同于获得oldObject的属性值
                    Object oldValue = readMethod.invoke(oldObject);
                    // 在newObject上调用get方法等同于获得newObject的属性值
                    Object newValue = readMethod.invoke(newObject);

                    if(oldValue instanceof List){
                        continue;
                    }

                    if(newValue instanceof List){
                        continue;
                    }

                    if(oldValue instanceof Timestamp){
                        oldValue = new Date(((Timestamp) oldValue).getTime());
                    }

                    if(newValue instanceof Timestamp){
                        newValue = new Date(((Timestamp) newValue).getTime());
                    }

                    if(oldValue == null && newValue == null){
                        continue;
                    }else if(oldValue == null && newValue != null){
                        Map<String,Object> valueMap = new HashMap<String,Object>();
                            valueMap.put("oldValue",oldValue);
                            valueMap.put("newValue",newValue);

                        map.put(name, valueMap);

                        continue;
                    }
                    // 比较这两个值是否相等,不等就可以放入map了
                    if (!oldValue.equals(newValue)) {
                        Map<String,Object> valueMap = new HashMap<String,Object>();
                            valueMap.put("oldValue",oldValue);
                            valueMap.put("newValue",newValue);

                        map.put(name, valueMap);
                    }
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }

        return map;
    }
}

原文地址:https://www.cnblogs.com/wangquanyi/p/12106514.html

时间: 2024-10-08 17:22:51

比较两个实体类是否一致utils的相关文章

对比两个实体类属性值的差异

/// <summary> /// 对比两个实体类属性值的差异 /// </summary> /// <typeparam name="T">实体类</typeparam> /// <param name="oldMod">原实体类</param> /// <param name="newMod">新实体类</param> /// <return

hibernate的反转引擎生成两个实体类的问题

在使用myeclipse中自带的hibernate 进行jsp开发时候遇到了这个问题.使用hibernate的反转引擎从数据库生成生成实体类,一个表生成了两个类,xx.java和xxId.java .显示的问题如下 其问题的根本在于没有设置对应表的主键.

两个实体类 复制 copy 工具类

1 import java.lang.reflect.Field; 2 import java.lang.reflect.Method; 3 import java.util.Date; 4 5 public class CopyBean{ 6 7 /** 8 * 复制sour里属性不为空的值到obje为空的属性 9 * 10 * @param obje 11 * 目标实体类 12 * @param sour 13 * 源实体类 14 * @param isCover 15 * 是否保留obje

两个实体类比较,记录前后的数据变化,精确到每列的值

不是通用的方法,只是提供一个思路. 实体类: /// <summary> /// 体例数据实体类 /// </summary> public class RulesLayout { /// <summary> /// 体例元数据行业代码 /// </summary> public string hydm { get; set; } /// <summary> /// 体例元数据行业名称 /// </summary> public st

利用反射找到对应类的get方法,并且记录两个实体类的差异

public class DriverAmendUtil {        public static String findDifferent(String str,DataEntity oldClass,DataEntity newClass){        Map<String, String> valuesMap = updateValue();        Map<String, String> valueList = valueMap();        try {

两个实体类必须每个字段都是一样的,类型一样。

文章地址: http://blog.csdn.net/yuliqi0429/article/details/40536585

C# 根据实体类的属性动态生成字符串

情景: 目前有两个实体类:Student,ClassInfo. public class Student { public string Name { get; set; } public string Sex { get; set; } public string Age { get; set; } } public class Classinfo { public string Subject { get; set; } public int Score { get; set; } } St

Hibernate实体类与数据表字段默认值之间的优先关系

在日常的应用开发过程中,我们一般都会使用对象关系映射来通过面向对象的编程模型来解决数据库的操作,我们生产过程当中使用较多的当属Hibernate框架了,他非常灵活,为我们提供了多种方式来实现数据层的操作与管理.通过实体类与数据表的映射,实体类对应表,属性对应字段就可以将我们想要生产的对象赋值到数据库,但是我们有时也需要查询对象,但是无论什么操作,都必须通过实体类来传递数据. 有时我们数据库有一些字段是数据库自动赋值,禁止用户通过程序修改的,如记录生成时间,那么如果你实体类按照正常情况下,你为了查

javabean 实体类的转换

1. spring 工具类 BeanUtils.copyProperties 简单的实体类之间的转换,不能copy Date类型,利用java反射的原理来进行属性的复制.如果两个实体的类的里面嵌套实体类的类型不一样,copy后实体类的变为原实体类的类型,当在此使用目标实体类的时候会发生类型的转化异常.2. MapStruct是一个代码生成器的工具类,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个实体变化成一个实体.在实际项目中,我们经常会将PO转DTO.DTO转PO等一些实