Java 中 DO、PO、BO、DTO、VO 等各對象概念說明


一、各對象說明

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;
    }
    
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM