前言
编程中比较常见的问题就是controller层的DTO转为对应的数据操作层的DO。或者是在一系列service操作之后返回到controller层的DTO转换。或者是还需要把DTO转VO。
模型介绍
1、用户发出请求,表单的数据层被匹配为 VO
2、展示层把 VO 转换为服务层对应方法锁要求的 DTO,传输给服务层
3、服务层首先根据 DTO 的数据构造一个 DO,调用 DO 的业务方法完成具体业务
4、服务层把 DO 转换为持久层对应的 PO,调用持久层持久化方法,把 PO 传递给它完成持久化操作
一般来说都是常用DTO和BO也就够了。特殊情况需要封装VO,PO基本用不着
之前的写法
以下是伪代码
public voud conver(ADO b){
ADTO a = new DTO();
a.setName(b.getName());
a.setNum(b.getName());
return a;
}
一般情况下DO转对应的DTO的时候,很多的类的名称都是一模一样的,这个时候就会要反复写这种conver。那么就可以用到BeanUtils.copyProperties()这个方法了。但是有时候还需要list的转换,以及更加通用的处理
BeanCopyUtil
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
public class BeanCopyUtil {
public static <T, S> List<T> convertList(Collection<S> srcList, Class<T> targetClazz) {
if (CollectionUtils.isEmpty(srcList)) {
return Collections.emptyList();
}
T target = null;
try {
List<T> dist = new ArrayList<T>();
for (S src : srcList) {
//目标类注意必须实现空构造函数
target = targetClazz.newInstance();
BeanUtils.copyProperties(src, target);
dist.add(target);
}
return dist;
} catch (Exception e) {
throw new IllegalArgumentException("对象" + targetClazz.getSimpleName() + "复制属性出错", e);
}
}
/**
*
* @param src
* @param targetClazz
* @return
*/
public static <T, S> T convert(S src, Class<T> targetClazz) {
if (src == null ) {
return null;
}
try {
//目标类注意必须实现空构造函数
T target = targetClazz.newInstance();
BeanUtils.copyProperties( src,target);
return target;
} catch (Exception e) {
throw new IllegalArgumentException("对象" + targetClazz.getSimpleName() + "复制属性出错", e);
}
}
}
最后
这样我们的通用转换模型pojo工具类就完成了。通过该工具类可以方便的做各层之间模型的切换了。
项目github地址:https://github.com/alex9567/SpringCloudScaffold