您的位置 首页 java

Java开发经验总结篇(1)——数据保存的整洁方法

我们在做后端开发的时候,最经常做的就是增删改查,对于数据的增加保存,不管持久层用的是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的是哪些字段。

本次分享就到此结束了,谢谢大家关注,后续会继续分享更多的开发经验,欢迎大家在评论区多多交流,互相成长!

文章来源:智云一二三科技

文章标题:Java开发经验总结篇(1)——数据保存的整洁方法

文章地址:https://www.zhihuclub.com/183677.shtml

关于作者: 智云科技

热门文章

网站地图