一、各對象說明
1.1 PO(persistant object) 持久對象
* 用於表示數據庫中的一條記錄,沒有任何行為方法;
* 遵守 Java Bean 的規范,只擁有 getter/setter 方法;
* 可以將一條記錄做為一個對象處理,可以方便轉化為其他對象。
1.2 DAO(Data Access Object ) 數據訪問對象
* 負責持久層操作,通常和 PO 結合使用;
* 包含了各種數據庫的操作方法,為業務層提供數據庫的 CRUD 操作;
1.3 DO(Domain Object) 領域對象
* 從現實世界中抽象出來的有形或無形的業務實體。
1.4 BO(business object) 業務對象
* 將業務邏輯封裝為一個對象,封裝了對 DAO、RPC 等的調用;
* 可以包含一個或多個其他對象,如一個簡歷BO,包含教育經歷、工作經歷、社會關系等 PO/DO 對象
* 可以進行 PO/DO 與 VO/DTO 之間的轉換;
1.5 DTO(Data Transfer Object)數據傳輸對象
* 表示一個數據傳輸對象;
* 通常用於不同服務或服務不同分層之間的數據傳輸;
* 與 VO 概念相似,區別點在於設計理念上,主要用於 API 服務調用。
1.6 VO(view object) 值對象
* 視圖對象,用於展示層;
* 減少傳輸數據量大小和保護數據庫結構不外泄。
二、對象轉換
2.1 DO/BO 與 PO 之間的轉換
@Getter
@Setter
public class OrderPO {
private String orderId;
private String orderName;
private String creator;
private Date createTime;
private String modifier;
private Date modifyTime;
}
@Getter
@Setter
public class Order {
private String orderId;
private String orderName;
private String creator;
private Date createTime;
}
通過工廠模式封裝轉換邏輯,工廠與倉儲模式往往結對出現,應用於數據的初始化和持久化兩類場景。
public class OrderFactory {
public OrderPO createOrderPO(Order order, UserDTO userDTO) {
OrderPO orderPO = new OrderPO();
orderPO.setOrderId(order.getOrderId());
orderPO.setOrderName(order.getOrderName());
orderPO.setCreator(order.getCreator());
orderPO.setCreateTime(order.getCreateTime());
orderPO.setModifier(userDTO.getUserName());
orderPO.setModifyTime(new Date());
return orderPO;
}
public Order getOrder(OrderPO orderPO) {
Order order = new Order();
order.setOrderId(orderPO.getOrderId());
order.setOrderName(orderPO.getOrderName());
order.setCreator(orderPO.getCreator());
order.setCreateTime(orderPO.getCreateTime());
return order;
}
}
2.2 DO/BO 與 DTO/VO 之間的轉換
@Getter
@Setter
public class OrderDTO {
private String orderId;
private String orderName;
private String creator;
private Date createTime;
}
@Getter
@Setter
public class OrderVO {
private String orderId;
private String orderName;
private String creator;
private Date createTime;
}
通過 組裝類(Assembler) 負責將應用服務返回的多個 DO/BO 對象組裝為前端 DTO /VO 對象,或將前端請求的 DTO 對象轉換為多個 DO/BO 對象,供應用服務作為參數使用。組裝類中不應有業務邏輯,主要負責格式轉換、字段映射等。Assembler 往往與 DTO 同時存在。
public class OrderAssembler {
public static OrderVO toVO(Order order) {
OrderVO orderVO = new OrderVO();
orderVO.setOrderId(order.getOrderId());
orderVO.setOrderName(order.getOrderName());
orderVO.setCreator(order.getCreator());
orderVO.setCreateTime(order.getCreateTime());
return orderVO;
}
public static OrderDTO toDTO(Order order) {
OrderDTO orderDTO = new OrderDTO();
orderDTO.setOrderId(order.getOrderId());
orderDTO.setOrderName(order.getOrderName());
orderDTO.setCreator(order.getCreator());
orderDTO.setCreateTime(order.getCreateTime());
return orderDTO;
}
public static Order toDO(OrderDTO orderDTO) {
Order order = new Order();
order.setOrderId(orderDTO.getOrderId());
order.setOrderName(orderDTO.getOrderName());
order.setCreator(orderDTO.getCreator());
order.setCreateTime(orderDTO.getCreateTime());
return order;
}
}