前言
編程中比較常見的問題就是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