bean数据对比方法,实现修改记录功能(显示修改的字段的原值与修改值)

bean数据对比方法,实现修改记录功能(显示修改的字段的原值与修改值)封装通用数据对比方法 两个实体对比 修改前数据和修改后数据 返回一个 Map string list object gt map 的 key 值为修改的字段名称 map 的 value 对象为 List object list 里存两个值 一个为该字段修改前的值和该字段修改的前的值 object string list object

大家好,我是讯享网,很高兴认识大家。

封装通用数据对比方法,两个实体对比,修改前数据和修改后数据,返回一个Map<String,List<Object>>,

map的key值为修改的字段名称,map的value对象为List<Object>,list里存两个值,一个为该字段修改前的值和该字段修改的前的值

见下方代码:

/ * 比较两个相同类实体属性值,返回一个map以有差异的属性名为key,value为一个list分别存obj1,obj2此属性名的值 * @param obj1 进行属性比较的对象1 * @param obj2 进行属性比较的对象2 * @param ignoreArr 选择忽略比较的属性数组 * @return 属性差异比较结果map */ public static Map<String, List<Object>> compareFields(Object obj1, Object obj2, String[] ignoreArr) { try{ Map<String, List<Object>> map = new HashMap<String, List<Object>>(); List<String> ignoreList = null; if(ignoreArr != null && ignoreArr.length > 0){ // array转化为list ignoreList = Arrays.asList(ignoreArr); } //只比较基本类型、包装类型、String类型 、Date类型 String[] types = {"java.lang.Integer", "java.lang.Double", "java.lang.Float", "java.lang.Long", "java.lang.Short", "java.lang.Byte", "java.lang.Boolean", "java.lang.Character", "java.lang.String", "java.util.Date", "int","double","long","short","byte","boolean","char","float"}; List<String> typeList=Arrays.asList(types); if (obj1.getClass() == obj2.getClass()) {// 只有两个对象都是同一类型的才有可比性 Class clazz = obj1.getClass(); // 获取object的属性描述(有get、set才叫属性) PropertyDescriptor[] pds = Introspector.getBeanInfo(clazz,Object.class).getPropertyDescriptors(); Field[] fields = clazz.getDeclaredFields(); List<Object> list; for (PropertyDescriptor pd : pds) { if (pd.getWriteMethod()==null) { continue; } String name = pd.getName();// 属性名 if(ignoreList != null && ignoreList.contains(name)){// 如果当前属性选择忽略比较,跳到下一次循环 continue; } //只比较基本类型、包装类型、String类型 、Date类型 if (!typeList.contains(pd.getPropertyType().getName())) { continue; } Method readMethod = pd.getReadMethod();// get方法 // 在obj1上调用get方法等同于获得obj1的属性值 Object o1 = readMethod.invoke(obj1); // 在obj2上调用get方法等同于获得obj2的属性值 Object o2 = readMethod.invoke(obj2); if(o1 == null && o2 == null){ continue; } //时间类型处理,精确到年月日 if(o1 instanceof Date){ o1=DateUtil.format((Date)o1,DateUtil.YYYY_MM_DD); } if(o2 instanceof Date){ o2=DateUtil.format((Date)o2,DateUtil.YYYY_MM_DD); } //字符序列处理,null和""默认相等 if (o1 instanceof CharSequence||o2 instanceof CharSequence){ if ((o1==null&&"".equals(o2))||(o2==null&&"".equals(o1))) { continue; } } if (o1 != null && o2 != null&&o1.equals(o2)) { continue; } list = new ArrayList<>(); if (o1==null||"".equals(o1)) { list.add("空值"); }else { list.add(o1); } if (o2==null||"".equals(o2)) { list.add("空值"); }else { list.add(o2); } //获得注解值 for (Field field : fields) { if(name.equals(field.getName())&&field.isAnnotationPresent(CNDesc.class)){ name=field.getAnnotation(CNDesc.class).value(); break; } } map.put(name, list); } } return map; }catch(Exception e){ //e.printStackTrace(); return null; } }

讯享网

需要再修改记录表和修改记录bean 添加一个变更信息字段来保存变更信息,如下

讯享网private String operChange;//变更信息


讯享网

调用:

//获取变更信息 Map<String, List<Object>> changeMap=ObjectUtil.compareJsonFields(old, newObj); if (!ObjectUtil.isNull(changeMap)&&!changeMap.isEmpty()) { //将得到的变更信息保存到操作记录表 saveLaborforceUpdateLog(laborUserId, adminUserId, infoId, JSON.toJSONString(changeMap)); }

 

现在页面读取变更信息效果为:

现在已经显示发生变化字段的名称、原值与修改后值,但字段名称为bean对象的英文名,客户看不懂的,所以我们要转化成中文,具体代码如下:

先新建一个自定义注解java类

讯享网package com.doer.beanutil; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; / * 中文描述注解 * @author Administrator * */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.FIELD})//注解作用于类和字段上 public @interface CNDesc{ String value(); }

再在实体bean类引用注解:@CNDesc(value="中文名称")

例如

 / * 工作岗位 */ @CNDesc(value="工作岗位") private String laborPosition; / * 工作单位的部门 */ @CNDesc(value="工作部门") private String laborDepartment; / * 民族 */ @CNDesc(value="民族") private Integer nation; @CNDesc(value="籍贯") private String nativePlace;//籍贯 / * 用工起始日期(第一次合同开始日期) */ @CNDesc(value="用工时间") private Date laborStartDate; / * 用工结束日期(离职日期) */ @CNDesc(value="离职时间") private Date laborEndDate; 

最终效果为:

页面打开查看变更信息弹窗部分js:

讯享网//查看变更信息
function lookChange(changeInfo){
	$('#changeInfoModalId tbody').html('');
	var html='';
	$.each(changeInfo,function(key,val){
		//console.log("修改项:"+key+",原值:"+val[0]+";现值:"+val[1]+"\r\n");
		html+="<tr>";
		html+="<td>"+key+"</td>";
		html+="<td>"+val[0]+"</td>";
		html+="<td>"+val[1]+"</td>";
		html+="</tr>"
	});
	$('#changeInfoModalId tbody').html(html);
	$("#changeInfoModalId").modal("show");
}

数据库表变更信息字段格式:

{"工伤基数":[,],"养老基数":[,],"失业基数":[,],"医疗基数":[,],"生育基数":[,]}

小讯
上一篇 2025-02-28 22:42
下一篇 2025-02-19 21:45

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/34108.html