字段数据修改历史框架
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字段数据修改历史框架相关的知识,希望对你有一定的参考价值。
需求分析 :
当我们需要修改一个对象数据持久化到数据库的时候,需要记录这个数据表被修改的字段记录时可使用此框架。
原理:
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 { }
以上是关于字段数据修改历史框架的主要内容,如果未能解决你的问题,请参考以下文章