java/web/springboot数据修改历史记录设计
在一些领域,记录数据的变更历史是非常重要的。比如人力资源系统…
需要记录个人的成长历史。再比如一些非常注重安全的系统,希望在必要时可以对所有的历史操作追根溯源,有据可查。
1.前言
比如,修改一个人的姓名从“张三”变为了“李四”,那么在进行记录的时候,记录的信息可能如下:
姓名:(张三)=>(李四);
如图:
这样就很好的体现出了修改了哪个字段,修改前后的数据分别是什么。
关键的信息无论怎么修改都会有据可查,时间、人物、修改数据前后信息等。
2.实现方式(较low):
直接做个工具类,调用传入对应的参数 即可:
package com.bonc.util;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test<T> {
public String contrastObj(Object oldBean, Object newBean) {
String str="";
T pojo1 = (T) oldBean;
T pojo2 = (T) newBean;
try {
Class clazz = pojo1.getClass();
Field[] fields = pojo1.getClass().getDeclaredFields();
int i=1;
for (Field field : fields) {
if("serialVersionUID".equals(field.getName())){
continue;
}
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
Method getMethod = pd.getReadMethod();
Object o1 = getMethod.invoke(pojo1);
Object o2 = getMethod.invoke(pojo2);
if(o1==null || o2 == null){
continue;
}
if (!o1.toString().equals(o2.toString())) {
if(i!=1){
str+=";";
}
str+=i+"字段名称:"+field.getName()+",旧值:"+o1+",新值:"+o2;
i++;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return str;
}
public static void main(String[] args) {
// 模拟旧数据
entity oldModel = new entity();
oldModel.setId("1");
oldModel.setName("张三");
// 模拟新数据
entity model = new entity();
model.setId("2");
model.setName("李四");
Test<entity>