/**
*@Author: yitianRen
*@Date: 13:56 2020/2/12
*@Description: 回写主表 根据idNum
*@Version v1.0
*/
private void writeBackeAmBaseInfo(String idNum,List<AmBaseInfoChgItem> amBaseInfoChgItems) {
try {
//遍历更改
if(!CollectionUtils.isEmpty(amBaseInfoChgItems)){
//操作实体
AmBaseInfo amBaseInfo=new AmBaseInfo();
Field[] fields = AmBaseInfo.class.getDeclaredFields();
Map<String,Object> fidldValMap = new HashMap<>();
for (AmBaseInfoChgItem amBaseInfoChgItem : amBaseInfoChgItems) {
//枚举类特殊处理
if("adminPost".equals(amBaseInfoChgItem.getItemField())){
fidldValMap.put(amBaseInfoChgItem.getItemField(), AdminPost.valueOf(amBaseInfoChgItem.getItemValueNew()));
}else if ("acntWorkYear".equals(amBaseInfoChgItem.getItemField())) {
fidldValMap.put(amBaseInfoChgItem.getItemField(), new BigDecimal(amBaseInfoChgItem.getItemValueNew()));
}else{
fidldValMap.put(amBaseInfoChgItem.getItemField(), amBaseInfoChgItem.getItemValueNew());
}
}
//反射赋值
for (Map.Entry<String, Object> entry : fidldValMap.entrySet()) {
for (Field field : fields) {
if (field.getName().equals(entry.getKey())) {
field = AmBaseInfo.class.getDeclaredField(field.getName());
//私有值可注入
field.setAccessible(true);
field.set(amBaseInfo, entry.getValue());
}
}
}
amBaseInfo.setIdNum(idNum);
amBaseInfoMapper.updateByPrimaryKeySelective(amBaseInfo);
}
}catch (Exception e){
throw new RuntimeException("回写主表失败"+e);
}
}
思考:如果实体类中枚举类型过多,是不是需要些很多判断?其实是有优化方案的,这里给个思路和部分代码
判断实体类中是否是枚举类,如果是枚举就通过枚举类型和值获取到响应的枚举然后反射写给主表
用到的util和其他内容在另一篇博客EnumUtil通过枚举类型和相应的值返回枚举And转换枚举到JSONArray
if(BaseEnum.class.isAssignableFrom(f.getType())){//枚举类型
//前端传递过来的变更项汇总列表中变更前、后的值是code,人员信息实体中是枚举类型,需要转换一下
f.set(baseInfo,EnumUtil.codeOf(f.getType(),newValue));
}