开发就是苦力,最近有一个这样的需求:
用日志记录被修改的数据 那些字段被修改了。
好吧。胳膊拧不过大腿,**的。干就完事儿。
需求分析:不河里。
需求实现:很(bu)难(gan)。
要记录 那些被修改了 需要知道修改前后的字段值 并进行比较和记录。即 数据库原来的数据 和前端传递的值进行比较。
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Field;
import java.util.*;
/**
* @param clazz 类类型
* @param a 之前的对象
* @param b 值后的对象
* @param ignores 忽略不需要比较的对象
* @param <T>
* @return 不一样的值 key:属性,value 比较前后的值
* @throws IllegalAccessException
*/
public <T> Map<String, String> findNotEqualFields(Class<T> clazz, T a, T b, Set<String> ignores) throws IllegalAccessException {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
}
Map map = null;
for (Field field : fields) {
if (ignores != null && ignores.contains(field.getName())) {
continue;
}
if (!Objects.equals(field.get(a), field.get(b))) {
if (map == null) {
map = new HashMap();
map.put("修改时间",new Date());
}
map.put(field.getName(), StringUtils.join("修改前:", field.get(a), ",", "修改后:", field.get(b), ";"));
}
}
return map;
}
最近又来了一个需求 【人员和机构信息同步】【全量的】
需要比较对象是否不一致,不一致的用update,一致的数据不更新。
需求分析:不河里。
需求实现:*******
难道不知道用 消息发通知的形式,修改那些数据 发个通知给下游。然后就可以定向修改那些数据。
全量数据比较 加修改 这样的奇葩需求 完全是上游设计的失误。
实现方案:
1.比较那些不一样的 记录不一样的数据 并修改
/**
* @param clazz
* @param a
* @param b
* @param ignores
* @param <T>
* @return
* @throws IllegalAccessException
*/
public <T> Boolean isAllEquals(Class<T> clazz, T a, T b, Set<String> ignores) throws IllegalAccessException {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
}
for (Field field : fields) {
if (ignores != null && ignores.contains(field.getName())) {
continue;
}
if (!Objects.equals(field.get(a), field.get(b))) {
return false;
}
}
return true;
}