在实际mis项目中增删改查必不可少,针对"改"的操作,重要的项目中都要有变更历史记录.本实例提供了一个实体属性变更历史记录工具类,只要写很少的代码就能实现强大的变更历史记录功能.本工具类的主要优点是1.工具类对实体对象没有依赖性,任何对象都能记录历史.

先看看如何使用吧:
1.得到变化前后的对象.
2.调用下面方法传入第一步中的值.
HistoryUtil util = new HistoryUtil();
util.record(类名, 变化前的对象, 变化后的对象,实体Id,修改人);

例子详细代码:

package com.tgb.lk.history;public class HistoryTest {public static void main(String[] args) {Student s = new Student();s.setId(1);s.setName("李坤");s.setSex("男");s.setClazz("五期提高班");// 可以使用commons-beanutils-xxx.jar中的下面这个方法来保留原对象.// BeanUtils.copyProperties(dest, src);Student s2 = new Student();s2.setId(1);s2.setName("李佳");s2.setSex("女");// HistoryUtil util = new HistoryUtil();// util.record(Student.class, s, s2,"1","admin");HistoryUtil<Student> util = new HistoryUtil<Student>();//方法内部有输出util.record(Student.class, s, s2, "1", "admin");}
}

例子输出结果:

实体类:

package com.tgb.lk.history;public class Student {private int id;private String name;private String sex;private String clazz;//get和set方法@Overridepublic String toString() {return "Student [clazz=" + clazz + ", id=" + id + ", name=" + name+ ", sex=" + sex + "]";}
}

核心逻辑:
变更历史实体类:

package com.tgb.lk.history;import java.util.Date;public class History {private int id;private String entity; // 实体类名,标记是哪个实体类private String entityId; // 实体对象的Idprivate String property; // 实体的属性名,标记实体的哪个属性发生修改private String oldValue; // 原属性值private String newValue; // 新属性值private String user; // 修改人private Date modifyDate; // 修改时间private String desc; // 描述//get和set方法略@Overridepublic String toString() {return "\n History [id=" + id + ", entity=" + entity + ",\n entityId="+ entityId + ", property=" + property + ", oldValue="+ oldValue + ", newValue=" + newValue + ",\n user=" + user+ ", modifyDate=" + modifyDate + ", desc=" + desc + "]\n";}
}

HistoryUtil类(注意需要修改一下注释中添加入库和批量入库的实现):

package com.tgb.lk.history;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/** @author likun * 记录属性变更历史的工具类,使用步骤见main方法.* HistoryUtil util = new HistoryUtil();* util.record(Student.class, s, s2,"1","admin");*/
public class HistoryUtil<T> {/*** 支持自己定义一个History对象并保存入库.* * @param history*/public void record(History history) {System.out.println(history);// 调用添加入库方法.}// 批量保存到数据库中,考虑到对象修改的属性可能较多,所以采用批量导入效率会高一些.public void record(List<History> historys) {System.out.println(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 {if (!field.get(oldObj).equals(field.get(newObj))) {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.setUser(user);// 记录修改者list.add(history);}} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}record(list);// 调用保存入库的方法.}}

这篇文章中是属性变更历史记录框架的核心逻辑,看看你是否有这样的需求:
1.所有属性都记录变更历史太多,有些属性我不想记录变更历史.
2.实体属性变化前后的值需要把编码转成有意义的文字.例如:实体类中性别用0,1表示,而希望变更历史中记录前后变化的值是"男","女".
3.传入实体对象自动识别实体Id,而不需要手工传入.
4.实体的属性名不好记,想加一个好记别名,这样便于查询.

请看下篇文章:http://blog.csdn.net/lk_blog/article/details/8092925

实体属性变更历史记录框架(一)-变更历史记录从此无忧(http://blog.csdn.net/lk_blog/article/details/8007777)

实体属性变更历史记录框架(二)-变更历史记录从此无忧(http://blog.csdn.net/lk_blog/article/details/8092925)

限于本人水平有限,很多地方写的并不完美,希望大家不吝赐教.如果觉得本文对您有帮助请顶支持一下,如果有不足之处欢迎留言交流,希望在和大家的交流中得到提高.

代码下载:http://download.csdn.net/detail/lk_blog/4667643

实体属性变更历史记录框架(一)-变更历史记录从此无忧相关推荐

  1. 实体属性变更历史记录框架(三)-变更历史记录从此无忧

    实体属性变更历史记录框架(一)-变更历史记录从此无忧(http://blog.csdn.net/lk_blog/article/details/8007777) 实体属性变更历史记录框架(二)-变更历 ...

  2. vue框架:变更页面background背景颜色 - 代码篇

    vue框架:变更body,html页面background背景颜色 场景bug介绍: vue页面切换,导致后面的页面背景颜色被上一个页面背景色覆盖,如何避免这个问题. Method 1. 修改 sty ...

  3. MyBatis实体属性与表的字段不对应的解决方案

    MyBatis实体属性与表的字段不对应的解决方案 参考文章: (1)MyBatis实体属性与表的字段不对应的解决方案 (2)https://www.cnblogs.com/EasonJim/p/765 ...

  4. 笔记-项目整体管理-变更管理-实施整体变更控制

    整体变更控制流程 提出和接受变更请求: 对变更进行初审: 变更方案论证: CCB对变更进行审查.审批: 发出变更通知并开始实施: 变更实施的监控: 变更效果的评估: 判断发生变更后项目是否已纳入正常轨 ...

  5. wifi名称可以有空格吗_收购公司后可以变更公司名称吗,变更公司名称和股权如何处理?...

    [点击文末小程序,免费咨询法律问题] 公司收购是指二手设备收购,指向目标公司的二手设备,废旧物资,进而获取目标公司的全部或部分业务,取得对拆除的控制权.那么,收购公司后可以变更公司名称吗,变更公司名称 ...

  6. 手机360浏览器怎么清空历史记录 手机360浏览器历史记录清空方法分享

    任何一款浏览器产品在使用一段时间后都会出现历史记录,手机360浏览器自然也不能例外.而这些历史记录如果长期不清理的话,则导致手机越来越卡!那么,手机360浏览器怎么清空历史记录?不清楚具体操作的朋友, ...

  7. 【java】List 根据实体属性值搜索

    List 根据实体属性搜索 工具类如下所示,主要使用了泛型,反射 入参: list,待查找的 list field: 要根据 list 中的哪个属性来查找 ,如上面的 TestModel 中的 nam ...

  8. Java比较两个实体属性值是否相同,将不同的属性输出

    /*** 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值* @param oldObject 进行属性比较的 ...

  9. VMWarevSphere Client 克隆虚拟机、变更IP地址、变更主机名、修改MAC地址

    VMWarevSphere Client 克隆虚拟机.变更IP地址.变更主机名.修改MAC地址 vSphere 是VMware公司推出一套服务器虚拟化解决方案 一.VMWarevSphere Clie ...

最新文章

  1. vSAN读者交流之1-要为不同时间的服务器选择合适的系统版本
  2. 一行代码不用写,就可以训练、测试、使用模型,这个 star 量 1.5k 的项目帮你做到...
  3. 个人项目的设计与分析——类饿了么、美团式订餐类校园食堂版App“加个蛋”。...
  4. linux下安装使用libuuid(uuid-generate)
  5. JVM内存管理概述与android内存泄露分析
  6. yum安装php7.2
  7. 有一定基础学python_有一定编程基础,有什么好的自学python的教程吗?
  8. 移远EC600S-CN (4) - MQTT接入阿里云
  9. windows应用迁移到linux下
  10. Web服务中延时对QoE(体验质量)的影响
  11. visual studio2010中几个快捷键的使用
  12. Curvy Little Bottles——ACM icpc 2012 word final problem B
  13. 如何把电脑加上公司的域
  14. 一文带你看透IP归属地
  15. 网易云信助力兴趣社交头部玩家,【微光】打造在线交友电影院
  16. 笔记本电脑插过一次typeC的耳机之后在插3.5的圆孔耳机不能用?
  17. C语言:选列主元约当消元法求线性方程组唯一解
  18. 开学之际被Turkey问候,只能祭出正则大法
  19. 阿里云服务配置SSH密钥对登陆
  20. 简单的网络考试系统__java

热门文章

  1. LSJ_NHibernate第一章 NHibernate介绍
  2. IDEA用maven整合ssh框架
  3. NSMapTable、NSHashTable与NSPointerArray的封装
  4. [Spring实战系列](19)Servlet不同版本之间的区别
  5. [PHP]json_encode增加options参数后支持中文
  6. 昼猫笔记 JavaScript -- 闭包
  7. iOS笔记(一)GCD多线程:信号量和条件锁
  8. 深入理解VMware虚拟网络
  9. cisco 三层交换机作DHCP服务器的配置
  10. PAT A1045 动态规划