方法调用
/**
* 方法调用
* @param args
*/
public static void main(String[] args) {
Teacher teacher = Teacher.builder().id(1L).age(25).sal(new BigDecimal(123)).name("老师").build();
Teacher teacher1 = Teacher.builder().id(1L).age(26).sal(new BigDecimal(1231)).name("老师1").build();
System.out.println("教师信息-1:"+"\n"+teacher);
System.out.println("教师信息-2:"+"\n"+teacher1);
//id不需要比对
List<HistoryLog> logList = getHistoryLog(teacher,teacher1, Arrays.asList("id"));
if (ObjectUtil.isNotEmpty(logList)){
logList.forEach(System.out::println);
}
}
记录日志
/**
* 记录属性值变化日志
* @param class1 新数据
* @param class2 历史数据
* @param filterFields 不需要比对的字段
* @return List 变化日志
*/
private static <T> List<HistoryLog> getHistoryLog(T class1, T class2, List<String> filterFields) {
//记录集合
List<HistoryLog> historyLogs = CollUtil.newArrayList();
//判断是否为同类
if(class1.getClass() != class2.getClass()){
throw new ClassCastException("数据类型不一致");
}
//获取所有类字段
Field[] fields = ReflectUtil.getFields(class1.getClass());
//过滤不需要比对的字段
List<Field> fieldList = Arrays.stream(fields).filter(f->!filterFields.contains(f.getName())).collect(Collectors.toList());
for (Field field : fieldList) {
field.setAccessible(true);
try {
Boolean b = false;
//获取属性值
Object value1 = field.get(class1);
Object value2 = field.get(class2);
//class1属性值不为空,class2属性值为空
if (ObjectUtil.isNotEmpty(value1) && ObjectUtil.isEmpty(value2)){
b = true;
}
//class1属性值为空,class2属性值不为空
if (ObjectUtil.isEmpty(value1) && ObjectUtil.isNotEmpty(value2)){
b = true;
}
//值不为空,属性值不等
if (ObjectUtil.isNotEmpty(value1) && ObjectUtil.isNotEmpty(value2)){
//对比属性值是否相同
if(!CompareBooleanEnum.FiledType(value1,value2)){
b = true;
}
}
//发生变动,封装记录
if(b){
HistoryLog historyLog = HistoryLog.builder()
.dataId((Long) ReflectUtil.getFieldValue(class1,"id"))
.createTime(DateUtil.now())
.username("当前登录人")
.version(1)
.filed(field.getName())
.hisData(value1.toString())
.newData(value2.toString())
.build();
historyLogs.add(historyLog);
}
} catch (Exception e) {
}
}
return historyLogs;
}
HistoryLog类
/**
* 变更数据日志
*
* @author shuai
* @since 2022
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class HistoryLog {
//主键
private long id;
//数据id
private long dataId;
//变更时间
private String createTime;
//操作用户
private String username;
//版本
private Integer version;
//变更字段
private String filed;
//历史数据
private String hisData;
//变更数据
private String newData;
}
依据属性判断是否相同
import cn.hutool.core.util.ObjectUtil;
import java.math.BigDecimal;
/**
* 比较属性值是否相同
*
* @author shuai
* @since 2022
* @return Boolean 相同:true 不同:false
*/
public enum CompareBooleanEnum {
Long(){
@Override
public Boolean compareValue( Object var1, Object var2) {
Long v1 = (Long) var1;
Long v2 = (Long) var2;
if(ObjectUtil.equals(v1,v2)){
return true;
}
return false;
}
},
Boolean(){
@Override
public Boolean compareValue( Object var1, Object var2) {
Boolean v1 = (Boolean) var1;
Boolean v2 = (Boolean) var2;
if(ObjectUtil.equals(v1,v2)){
return true;
}
return false;
}
},
Integer(){
@Override
public Boolean compareValue(Object var1, Object var2) {
Integer v1 = (Integer) var1;
Integer v2 = (Integer) var2;
if(ObjectUtil.equals(v1,v2)){
return true;
}
return false;
}
},
BigDecimal(){
@Override
public Boolean compareValue(Object var1, Object var2) {
BigDecimal v1 = (BigDecimal) var1;
BigDecimal v2 = (BigDecimal) var2;
if(v1.compareTo(v2) == 0){
return true;
}
return false;
}
},
String(){
@Override
public Boolean compareValue(Object var1, Object var2) {
String v1 = (String) var1;
String v2 = (String) var2;
if(ObjectUtil.equals(v1,v2)){
return true;
}
return false;
}
};
public abstract Boolean compareValue(Object var1, Object var2);
/**
* 对比属性值是否相同
* @param var1 属性值1
* @param var2 属性值2
* @return Boolean 相同:true 不同:false
*/
public static Boolean FiledType(Object var1, Object var2){
//获取字段类型
String type = var1.getClass().getSimpleName();
for (CompareBooleanEnum code : CompareBooleanEnum.values()){
if (type.equalsIgnoreCase(code.name())){
if(!code.compareValue(var1,var2)){
return false;
}
break;
}
}
return null;
}
}
运行结果
教师信息-1:
Teacher(id=1, age=25, sal=123, name=老师)
教师信息-2:
Teacher(id=1, age=26, sal=1231, name=老师1)
日志记录:
HistoryLog(id=0, dataId=1, createTime=2022-08-21 13:00:57, username=当前登录人, version=1, filed=age, hisData=25, newData=26)
HistoryLog(id=0, dataId=1, createTime=2022-08-21 13:00:57, username=当前登录人, version=1, filed=sal, hisData=123, newData=1231)
HistoryLog(id=0, dataId=1, createTime=2022-08-21 13:00:57, username=当前登录人, version=1, filed=name, hisData=老师, newData=老师1)