我们在做后端开发的时候,最经常做的就是增删改查,对于数据的增加保存,不管持久层用的是mybatis还是hibernate,如果在一些特别场景下不能使用DTO进行参数传递的时候,我们通常都用MAP对数据进行接收然后后台再封装对象进行保存,但是在对map里面的参数取值set到对象的时候要对前台传参进行空判断,这时候就会出现很长的一串if…else if……
如下:
if(map.containsKey(key) && !StringUtils.isEmpty(map.get(key)){ user.setName(map.get(key)); }else if(map.containsKey(key) && !StringUtils.isEmpty(map.get(key)){ user.setAddr(map.get(key)); }else if(map.containsKey(key) && !StringUtils.isEmpty(map.get(key)){ user.setAge(map.get(key)); }else if(map.containsKey(key) && !StringUtils.isEmpty(map.get(key)){ user.setPhone(map.get(key)); }
……
这样看起来代码就会显得很臃肿难看。
那么我们可以怎么改造一下呢,这里我给大家介绍的是使用反射的方法来优化,具体做法如下:
- 1、 首先抽象出一个反射调用对象set方法的方法
/**
*
* @param sourceMap 参数map
* @param invokeObject 需要调用的set方法对应的对象
* @param mapKey sourceMap中的key
* @param setMethodName set方法全名称
* @param fieldTypeClazz set方法参数类型【Class】
*/ private <T,V> void setValueWhenNotNull(Map<String, Object> sourceMap,
T invokeObject, String mapKey, String setMethodName, Class<V> fieldTypeClazz) {
if(isKeyExistAndNotNull(sourceMap,mapKey)) {
Object value = sourceMap.get(mapKey);
try {
Method setMethod = invokeObject.getClass().getMethod(setMethodName, fieldTypeClazz);
setMethod.invoke(invokeObject, valueTransfer(value,fieldTypeClazz));
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 2、 然后把空判断也整合到第一步的方法里面去,即在方法一中做空判断再设值
/** * key与空判断 * @param map * @param key * @return */private boolean isKeyExistAndNotNull(Map<String, Object> srcMap, String key) { return srcMap.containsKey(key) && !StringUtils.isEmpty(srcMap.get(key)); }
- 3、最后再方法一内部根据set方法的参数对map的keyval做一下值转换
@SuppressWarnings("unchecked") private <T> T valueTransfer(Object orgValue, Class<T> returnType) { if( Long .class.equals(returnType)) { return (T) Long.valueOf(orgValue. toString ()); }else if(BigDecimal.class.equals(returnType)){ BigDecimal value = new BigDecimal(orgValue.toString()); return (T) value; }else if(String.class.equals(returnType)) { return (T) orgValue; } ....... return null; }
如此修改之后,在设置值的地方就可以简化成一下几行代码:
setValueWhenNotNull(srcMap, user, "userName", "setUserName", String.class); setValueWhenNotNull(srcMap, user, "age", "setAge", Integer.class); setValueWhenNotNull(srcMap, user, "addr", "setUserAddr", String.class); setValueWhenNotNull(srcMap, user, "userPhone, "setUserPhone", String.class);
这样看起来就简洁多了,一眼就可以看出set的是哪些字段。
本次分享就到此结束了,谢谢大家关注,后续会继续分享更多的开发经验,欢迎大家在评论区多多交流,互相成长!