码迷,mamicode.com
首页 > 其他好文 > 详细

字段数据修改历史框架

时间:2016-02-26 00:15:47      阅读:406      评论:0      收藏:0      [点我收藏+]

标签:

需求分析 :

当我们需要修改一个对象数据持久化到数据库的时候,需要记录这个数据表被修改的字段记录时可使用此框架。

 

原理:

1.数据库创建一张专门保存修改历史的表。

2.domain对象加入自定义的注解,便可以自由设置是否该属性的修改是否需要记录,字段的格式等

3.建立一个util类,当时update方法的时候,将对象传递进util方法中,util方法完成一系列的操作,包括判断字段是否有修改,记录操作等。

 

代码:

HistoryUtil.java

package cn.firstflag.crm.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

import cn.firstflag.crm.controller.BaseController;
import cn.firstflag.crm.dao.HistoryMapper;
import cn.firstflag.crm.domain.History;

/*
 * @ClassName 修改历史工具类
 * @Description 记录属性变更历史的工具类,使用步骤见main方法.
 *         HistoryUtil util = new HistoryUtil();
 *         util.record(Student.class, s, s2,"1","admin");
 * @CreateDate 2016/02/20
 * @ModeifyDate
 * @Author zhanmin.zheng
 * @Version 2.0
 */
public class HistoryUtil<T> {
    protected Logger log = Logger.getLogger(BaseController.class);//log4j
    
    @Autowired
    private HistoryMapper historyMapper;//修改历史表dao层
    
    /**
     * @Description 支持自己定义一个History对象并保存入库
     * @param history
     */
    public void record(History history) {
        System.out.println(history);
        historyMapper.insert(history);// 调用添加入库方法.
    }

    /**
     * @Description 批量保存到数据库中,考虑到对象修改的属性可能较多,所以采用批量导入效率会高一些
     * @param historys
     */
    public void record(List<History> historys) {
        log.debug("history is "+historys);
        log.debug("historyMapper is "+historyMapper);
        if (historys!=null)//如果记录不为空的时候添加
            historyMapper.insertList(historys);// 调用批量添加入库方法.
    }

    /**
     * 比较两个对象哪些属性发生变化,将变化的属性保存为History对象.
     * 
     * @param clazz
     *            修改类
     * @param oldObj
     *            老对象
     * @param newObj
     *            新对象
     * @param entityId
     *            实体Id
     * @param user
     *            修改人
     */
    public void record(Class<T> clazz, T oldObj, T newObj,
            String entityId, String user) {
        if (oldObj == newObj) {
            return;// 如果两个对象相同直接退出
        }
        
        List<History> list = new ArrayList<History>();
        Field[] allFields = clazz.getDeclaredFields();// 得到指定类的所有属性Field.
        
        for (Field field : allFields) {
            field.setAccessible(true);// 设置类的私有字段属性可访问.
            try {
                log.debug("new is "+field.get(newObj));
                log.debug("old is "+field.get(oldObj));
                String OldField = "";
                String NewField = "";
                if (field.get(oldObj) != null) {
                    OldField = field.get(oldObj).toString();
                }
                if (field.get(newObj) != null) {
                    NewField = field.get(newObj).toString();
                }
                
                if (OldField.equals(NewField)) {
                    History history = new History();
                    history.setEntity(clazz.toString());
                    history.setProperty(field.getName());
                    history.setOldValue(String.valueOf(field.get(oldObj)));
                    history.setNewValue(String.valueOf(field.get(newObj)));
                    history.setModifyDate(new Date());
                    history.setEntityId(entityId);// 记录修改的对象的主键Id.
                    history.setModifyUser(user);// 记录修改者
                    list.add(history);
                }
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        record(list);// 调用保存入库的方法.
    }

}

 

HistoryAlias.java

package cn.firstflag.crm.util;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/*
 * @Description 取得数据对象别名
 */
@Retention(RetentionPolicy.RUNTIME)
@Target( { java.lang.annotation.ElementType.FIELD,java.lang.annotation.ElementType.TYPE})
public @interface HistoryAlias {
    public abstract String alias();
}

 

HistoryNotRecord.java

package cn.firstflag.crm.util;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/*
 * @Description 判处不需要记录的字段
 */
@Retention(RetentionPolicy.RUNTIME)
@Target( { java.lang.annotation.ElementType.FIELD })
public @interface HistoryNotRecord {

}

 

字段数据修改历史框架

标签:

原文地址:http://www.cnblogs.com/sz-zzm/p/5218696.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!