实体属性变更历史记录框架(一)-变更历史记录从此无忧
在实际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
实体属性变更历史记录框架(一)-变更历史记录从此无忧相关推荐
- 实体属性变更历史记录框架(三)-变更历史记录从此无忧
实体属性变更历史记录框架(一)-变更历史记录从此无忧(http://blog.csdn.net/lk_blog/article/details/8007777) 实体属性变更历史记录框架(二)-变更历 ...
- vue框架:变更页面background背景颜色 - 代码篇
vue框架:变更body,html页面background背景颜色 场景bug介绍: vue页面切换,导致后面的页面背景颜色被上一个页面背景色覆盖,如何避免这个问题. Method 1. 修改 sty ...
- MyBatis实体属性与表的字段不对应的解决方案
MyBatis实体属性与表的字段不对应的解决方案 参考文章: (1)MyBatis实体属性与表的字段不对应的解决方案 (2)https://www.cnblogs.com/EasonJim/p/765 ...
- 笔记-项目整体管理-变更管理-实施整体变更控制
整体变更控制流程 提出和接受变更请求: 对变更进行初审: 变更方案论证: CCB对变更进行审查.审批: 发出变更通知并开始实施: 变更实施的监控: 变更效果的评估: 判断发生变更后项目是否已纳入正常轨 ...
- wifi名称可以有空格吗_收购公司后可以变更公司名称吗,变更公司名称和股权如何处理?...
[点击文末小程序,免费咨询法律问题] 公司收购是指二手设备收购,指向目标公司的二手设备,废旧物资,进而获取目标公司的全部或部分业务,取得对拆除的控制权.那么,收购公司后可以变更公司名称吗,变更公司名称 ...
- 手机360浏览器怎么清空历史记录 手机360浏览器历史记录清空方法分享
任何一款浏览器产品在使用一段时间后都会出现历史记录,手机360浏览器自然也不能例外.而这些历史记录如果长期不清理的话,则导致手机越来越卡!那么,手机360浏览器怎么清空历史记录?不清楚具体操作的朋友, ...
- 【java】List 根据实体属性值搜索
List 根据实体属性搜索 工具类如下所示,主要使用了泛型,反射 入参: list,待查找的 list field: 要根据 list 中的哪个属性来查找 ,如上面的 TestModel 中的 nam ...
- Java比较两个实体属性值是否相同,将不同的属性输出
/*** 比较两个实体属性值,返回一个map以有差异的属性名为key,value为一个Map分别存oldObject,newObject此属性名的值* @param oldObject 进行属性比较的 ...
- VMWarevSphere Client 克隆虚拟机、变更IP地址、变更主机名、修改MAC地址
VMWarevSphere Client 克隆虚拟机.变更IP地址.变更主机名.修改MAC地址 vSphere 是VMware公司推出一套服务器虚拟化解决方案 一.VMWarevSphere Clie ...
最新文章
- vSAN读者交流之1-要为不同时间的服务器选择合适的系统版本
- 一行代码不用写,就可以训练、测试、使用模型,这个 star 量 1.5k 的项目帮你做到...
- 个人项目的设计与分析——类饿了么、美团式订餐类校园食堂版App“加个蛋”。...
- linux下安装使用libuuid(uuid-generate)
- JVM内存管理概述与android内存泄露分析
- yum安装php7.2
- 有一定基础学python_有一定编程基础,有什么好的自学python的教程吗?
- 移远EC600S-CN (4) - MQTT接入阿里云
- windows应用迁移到linux下
- Web服务中延时对QoE(体验质量)的影响
- visual studio2010中几个快捷键的使用
- Curvy Little Bottles——ACM icpc 2012 word final problem B
- 如何把电脑加上公司的域
- 一文带你看透IP归属地
- 网易云信助力兴趣社交头部玩家,【微光】打造在线交友电影院
- 笔记本电脑插过一次typeC的耳机之后在插3.5的圆孔耳机不能用?
- C语言:选列主元约当消元法求线性方程组唯一解
- 开学之际被Turkey问候,只能祭出正则大法
- 阿里云服务配置SSH密钥对登陆
- 简单的网络考试系统__java
热门文章
- LSJ_NHibernate第一章 NHibernate介绍
- IDEA用maven整合ssh框架
- NSMapTable、NSHashTable与NSPointerArray的封装
- [Spring实战系列](19)Servlet不同版本之间的区别
- [PHP]json_encode增加options参数后支持中文
- 昼猫笔记 JavaScript -- 闭包
- iOS笔记(一)GCD多线程:信号量和条件锁
- 深入理解VMware虚拟网络
- cisco 三层交换机作DHCP服务器的配置
- PAT A1045 动态规划