美文网首页
[下]业务数据变动日志记录的一次需求

[下]业务数据变动日志记录的一次需求

作者: 壳叔 | 来源:发表于2019-10-08 11:15 被阅读0次

    今日一问

    <h4> 群友提问,怎么用 39.74 过半个月? </h4>

    <b>欢迎评论区回答,会在群内随机摘取问题or段子</b>

    渴望的目光

    正文

    紧接着上次的话题来聊[上]业务数据变动日志记录的一次需求

    上次因为项目需求,要做一个记录日志的功能,其实功能还蛮简单的造一个小工具类就可以了。

    这篇文章主要就是把上篇文章的代码改造成工具类,方便后期有相同需求的人,不用在手写了~

    那我们开始直接进入话题

    1. 首先第一步给bean加载完我们自定义的注解以后,进行工具类调用,如果你不知道自定义注解,请阅读[上]业务数据变动日志记录的一次需求
    1. 把工具类搬上来 BeanUtil
    
    import  java.util.HashMap;
    import  java.lang.reflect.Field;
    import  java.lang.reflect.Method;
    import  java.lang.reflect.Modifier;
    import  java.util.List;
    import  java.util.Map;
    
    /**
     * 本工具类目的是针对两个Bean内容做比较
     * 效果是为了日志记录方便
     * 例如日志内容 "参数名:xxx, 变动前:xxx -> 变动后:xxx;......"
     *
     * Created by kzyuan on 2019-09-05 11:28
     */
    public class BeanUtil {
        private static UserBean userBeanNew;
        private static UserBean userBeanOld;
    
    
        public static void main(String[] args)  {
            // 创建User Bean对象,并设值
            setUserBean();
            //数据对比返回结果集
            Map<String,String> resultMap = dataComparison(userBeanNew,userBeanOld);
        }
    
        // 创建User Bean对象,并设值
        private static void setUserBean() {
            userBeanOld = new UserBean();
            userBeanOld.setId("1");
            userBeanOld.setName("壳叔");
            userBeanOld.setAge("35");
            userBeanOld.setEmail("keshu@bhusk.com");
    
            userBeanNew = new UserBean();
            userBeanNew.setId("2");
            userBeanNew.setName("kk 壳");
            userBeanNew.setAge("36");
            userBeanNew.setEmail("kk@bhusk.com");
        }
    
        // 遍历 Bean
        private static Map<String,DataLogger> traversalBean(Object obj) throws Exception {
    
            //创建Map容器
            Map<String,DataLogger> objMap = new HashMap<String, DataLogger> ();
    
            //开始记录容器值
            Field[] fields = obj.getClass().getDeclaredFields();
            for (Field field : fields) {
                DataLogger dataLogger = new DataLogger();
                String mod = Modifier.toString(field.getModifiers());
                System.out.println("mod = " + mod);
                dataLogger.setMod(mod);
                // 跳过静态属性
                if (mod.indexOf("static") != -1) {
                    continue;
                }
    
                // 取得注解的设置的属性值
                SetFieldAttribute setField = field.getAnnotation(SetFieldAttribute.class);
                if (setField != null) {
                    String fieldName = setField.fieldName();
                    String fieldType = setField.fieldType();
                    dataLogger.setFieldName(setField.fieldName());
                    dataLogger.setFieldType(setField.fieldType());
    
                    System.out.println("注解的属性 fieldName = " + fieldName);
                    System.out.println("注解的属性 fieldType = " + fieldType);
    
                    String getMethod = "get" + field.getName().substring(0, 1).toUpperCase()
                            + field.getName().substring(1);
                    System.out.println("User Bean 属性的Get方法名 getMethod = " + getMethod);
                    dataLogger.setMethod(getMethod);
    
    
                    Class[] methodParam = null;
                    Object[] params = {};
                    Object retVal = obj.getClass().getMethod(getMethod, methodParam).invoke(obj, params);
    
                    if (fieldType.equals("list")) {
    //                    List<String> list = (List<String>) retVal;
    //                    if(null == list) {continue;}
    //                    int i = 1;
    //                    for (String favourite : list ) {
    //                        System.out.println("User Bean 属性的值 " + field.getName() + " : " + i + " = " + favourite);
    //                        i++;
    //                    }
                    } else {
                        // 取得Bean属性的值
                        System.out.println("User Bean 属性的值 " + field.getName() + " = " + retVal);
                        dataLogger.setFieldValue(retVal);
                    }
                }
                objMap.put(field.getName(), dataLogger);
            }
    
            return objMap;
        }
    
       /**
         * 类数据对比方法 会返回一个map 会存储发生变动的日志
         * @param newObj 变动后的bean
         * @param oldObj 变动前的bean
         */
        private static Map<String,String> dataComparison(Object newObj,Object oldObj) {
    
            //结果容器
            Map<String,String> resultMap = new HashMap<String, String>();
    
            try {
                /**
                 * 整理Bean分析数据
                 */
                Map<String,DataLogger> newObjMap = BeanUtil.traversalBean(newObj);
                Map<String,DataLogger> oldObjMap = BeanUtil.traversalBean(oldObj);
    
    
                /**
                 * 开始分析两组map数据
                 */
                for (Map.Entry<String, DataLogger> entry : newObjMap.entrySet()) {
    
                    /**
                     * 判断两组值数据
                     */
                    if (entry.getValue().getFieldValue() != oldObjMap.get(entry.getKey()).getFieldValue()) {
    
                        /**
                         * 记录日志的结果
                         */
    //                    resultMap.put(entry.getKey(), " field name: " + entry.getValue().getFieldName() +
    //                            " , new field value: " + entry.getValue().getFieldValue() +
    //                            " -> old field value: " + oldObjMap.get(entry.getKey()).getFieldValue());
                        resultMap.put(entry.getKey(), " 发生列名: " + entry.getValue().getFieldName() +
                                " , 变动后内容值: " + entry.getValue().getFieldValue() +
                                " -> 变动前内容值: " + oldObjMap.get(entry.getKey()).getFieldValue());
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return resultMap;
        }
    }
    
    
    /**
     * 用于存储解析后的bean
     */
    class DataLogger {
        private String mod;
        /**
         * 字段名
         */
        private String fieldName;
    
        /**
         * 字段内容
         */
        private Object fieldValue;
    
        /**
         * 字段类型
         */
        private String fieldType;
    
        /**
         * 属性的Get方法名
         */
        private String method;
    
        public String getMod() {
            return mod;
        }
    
        public void setMod(String mod) {
            this.mod = mod;
        }
    
        public String getFieldName() {
            return fieldName;
        }
    
        public void setFieldName(String fieldName) {
            this.fieldName = fieldName;
        }
    
        public Object getFieldValue() {
            return fieldValue;
        }
    
        public void setFieldValue(Object fieldValue) {
            this.fieldValue = fieldValue;
        }
    
        public String getFieldType() {
            return fieldType;
        }
    
        public void setFieldType(String fieldType) {
            this.fieldType = fieldType;
        }
    
    
        public String getMethod() {
            return method;
        }
    
        public void setMethod(String method) {
            this.method = method;
        }
    }
        
    
    1. 具体调用方式参考工具类的main方法~ 你会得到一个map结果集,最后根据自己需要自行处理优化结果集~~ 其它的我可不管咯
    1. 那本篇结束,我该去泡泡面了。

    相关文章

      网友评论

          本文标题: [下]业务数据变动日志记录的一次需求

          本文链接:https://www.haomeiwen.com/subject/mjqbpctx.html