java 数据更新前后对比工具类,主要用于记录数据变更前后的日志

编程入门 行业动态 更新时间:2024-10-11 21:29:44

java <a href=https://www.elefans.com/category/jswz/34/1771445.html style=数据更新前后对比工具类,主要用于记录数据变更前后的日志"/>

java 数据更新前后对比工具类,主要用于记录数据变更前后的日志

1.使用反射机制获取Bean字段
2.使用自定义注解获取字段说明;
3.动态多种数据类型都可支持,数据类型可自行添加
上代码

调用方式:

List<String> compareLog = SerializableFieldComparepare(Test.class, newTest, oldTest);

工具类:


import org.apachemons.lang3.StringUtils;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class SerializableFieldCompare {public static <T> List<String> compare (Class<T> type, T newObject, T  oldObject ) throws Exception {List<String> logList = new ArrayList<>();Class<?> newObj = newObject.getClass();Class<?> oldObj = oldObject.getClass();Field[] newFields = type.getDeclaredFields();for (int i = 0; i < newFields.length; i++) {FieldCompare newAnnotation = newFields[i].getAnnotation(FieldCompare.class);if(null != newAnnotation){PropertyDescriptor newPd = new PropertyDescriptor(newFields[i].getName(), newObj);Method getMethodNew = newPd.getReadMethod();Object oldVal = getMethodNew.invoke(oldObject);Object newVal = getMethodNew.invoke(newObject);boolean eq = false;if (oldVal instanceof String){String s1 = String.valueOf(oldVal).trim();String s2 = String.valueOf(newVal).trim();eq = !s1.equals(s2);}else if(oldVal instanceof Integer){int i1 = (Integer) oldVal;int i2 = (Integer) newVal;eq = i1 != i2;}else if(oldVal instanceof Double){double d1 = (Double) oldVal;double d2 = (Double) newVal;eq = d1 != d2;}else if(oldVal instanceof BigDecimal){BigDecimal b1 = (BigDecimal) oldVal;BigDecimal b2 = (BigDecimal) newVal;eq = b1pareTo(b2) != 0;}else if(oldVal instanceof Long){long l1 = (Long) oldVal;long l2 = (Long) newVal;eq = l1 != l2;}String s1 = oldVal == null ? "" : oldVal.toString().trim();String s2 = newVal == null ? "" : newVal.toString().trim();if (eq) {Map<String, String> map = codeToNameMap(newAnnotation);if (map.size() > 0) {logList.add(newAnnotation.chineseName() + "由:[" + map.get(s1) + "]更改为了:[" + map.get(s2) + "]");}else {logList.add(newAnnotation.chineseName() + "由:[" + s1 + "]更改为了:[" + s2 + "]");}}}}return logList;}private static Map<String,String> codeToNameMap(FieldCompare newAnnotation){Map<String,String> map = new HashMap<>();String properties = newAnnotation.properties();if(StringUtils.isNotBlank(properties)){String[] propertiesArr = properties.split(",");for (String propertie : propertiesArr) {String[] split = propertie.split(":");map.put(split[0],split[1]);}}return map;}
}

自定义注解类:

import java.lang.annotation.*;@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface FieldCompare {//字段名称String chineseName();//类型映射String properties() default "";}

测试Bean:
注解说明:
chineseName属性为字段名称
properties属性 是用来映射数字对应的类型名称

public class Test implements Serializable {private Integer id;private Integer serviceId;@FieldCompare(chineseName = "服务费收取方式", properties = "1:固定金额,2:百分比")private Integer serviceFeeCollectWay;@FieldCompare(chineseName = "线上")private BigDecimal servicePriceOnline;@FieldCompare(chineseName = "线下")private BigDecimal servicePriceOffline;private Integer type;private Date createTime;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getServiceId() {return serviceId;}public void setServiceId(Integer serviceId) {this.serviceId = serviceId;}public Integer getServiceFeeCollectWay() {return serviceFeeCollectWay;}public void setServiceFeeCollectWay(Integer serviceFeeCollectWay) {this.serviceFeeCollectWay = serviceFeeCollectWay;}public BigDecimal getServicePriceOnline() {return servicePriceOnline;}public void setServicePriceOnline(BigDecimal servicePriceOnline) {this.servicePriceOnline = servicePriceOnline;}public BigDecimal getServicePriceOffline() {return servicePriceOffline;}public void setServicePriceOffline(BigDecimal servicePriceOffline) {this.servicePriceOffline = servicePriceOffline;}public Integer getType() {return type;}public void setType(Integer type) {this.type = type;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}
}

更多推荐

java 数据更新前后对比工具类,主要用于记录数据变更前后的日志

本文发布于:2024-03-07 01:15:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1716464.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据   主要用于   工具   日志   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!