需求
客户希望实现下面的详情操作日志功能
思路
这样 只要修改数据库的地方,比如增,删,改的地方就要保存日志记录,增加和删除好做,麻烦的就是修改,怎么弄呢,整理了下:
参考链接
参考链接:
https://blog.csdn.net/liu_ling1216/article/details/80207985
//获取属性上的注解
https://blog.csdn.net/shidebin/article/details/86593949
步骤1
前提,根据id 获取 旧的对象, 传参获取新对象
步骤2
获取2个对象 同一个属性,不同的值,
将 属性名,新值 ,旧值 放入一个 list集合中
by the way 中文名: 根据注解获取
list = [
{
'name':,
'old':'',
'new':'',
comment:''
}
]
list中的每个对象,最好建一张表
保存到 日志表中去
测试代码
测试实体 student.java
package com.platform.utils;
import com.platform.annotation.Comment;
public class Student {
@Comment(value = "编号")
private Integer id;
@Comment(value = "姓名")
private String username;
@Comment(value = "年龄")
private Integer age;
public Student() {
}
public Student(Integer id, String username) {
this.id = id;
this.username = username;
}
public Student(Integer id, String username, Integer age) {
this.id = id;
this.username = username;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
自定义注解
/**
* 注解实体
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Comment {
String value() default "";
}
工具类 LogUtil.java
package com.platform.utils;
import com.platform.annotation.Comment;
import java.lang.reflect.Field;
import java.util.*;
public class LogUtil {
/**
* 获取两个对象同名属性内容不相同的列表
*/
public static List<Map<String, Object>> compareTwoClass(Object class1, Object class2) throws ClassNotFoundException, IllegalAccessException {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
//获取对象的class
Class<?> clazz1 = class1.getClass();
Class<?> clazz2 = class2.getClass();
//获取对象的属性列表
Field[] field1 = clazz1.getDeclaredFields();
Field[] field2 = clazz2.getDeclaredFields();
//遍历属性列表field1
for (int i = 0; i < field1.length; i++) {
//遍历属性列表field2
for (int j = 0; j < field2.length; j++) {
//如果field1[i]属性名与field2[j]属性名内容相同
if (field1[i].getName().equals(field2[j].getName())) {
field1[i].setAccessible(true);
field2[j].setAccessible(true);
//如果field1[i]属性值与field2[j]属性值内容不相同
if (!compareTwo(field1[i].get(class1), field2[j].get(class2))) {
Map<String, Object> map2 = new HashMap<String, Object>();
Comment comment = field1[i].getDeclaredAnnotation(Comment.class);
if(comment!=null){
map2.put("name", comment.value()); //注解名字
map2.put("old", field1[i].get(class1));
map2.put("new", field2[j].get(class2));
list.add(map2);
}
}
break;
}
}
}
return list;
}
//对比两个数据是否内容相同
public static boolean compareTwo(Object object1, Object object2) {
if (object1 == null && object2 == null) {
return true;
}
//以下注掉代码,看具体需求。因有时会出现源数据是没有进行赋值,因此是null;而通过EditText获取值的时候,虽然没有值,但是会变成"",但是本质是没有赋值的。
//if (object1 == "" && object2 == null) {
// return true;
//}
//if (object1 == null && object2 == "") {
// return true;
// }
if (object1 == null && object2 != null) {
return false;
}
if (object1.equals(object2)) {
return true;
}
return false;
}
public static void main(String[] args) throws IllegalAccessException, ClassNotFoundException {
Student s1 = new Student(1, "张三", 29);
Student s2 = new Student(2, "李四",29);
List<Map<String, Object>> maps = compareTwoClass(s1, s2);
for (Map<String, Object> m : maps){
System.out.println(m.get("name")+"===="+m.get("old")+"===="+m.get("new"));
}
}
}
测试结果:
自此 测试完毕,下面就是 无脑码代码了!