1. 程式人生 > >DO、DTO和VO分層設計的好處

DO、DTO和VO分層設計的好處

在日常的專案開發中,VO對應於頁面上需要顯示的資料(表單),DO對應於資料庫中儲存的資料(資料表),DTO對應於除二者之外需要進行傳遞的資料。

很多人可能對VO和DTO並不是那麼熟悉,相反對DO卻比較熟悉,那是因為在很多專案中由於種種原因我們只使用了DO,原因可能有以下幾種:

1、專案太小,對於一種業務實體,封裝成一個DO就夠了。

2、並不熟悉DTO、VO,更不知道他們之間的區別。

3、瞭解DO\DTO\VO之間的區別,但是懶得用。

那麼,這裡,博主再囉嗦一下為什麼要引入這麼多概念,為什麼我要建議大家在自己的專案中使用這些實體物件。

為什麼不能只用一個DO

我們來看這樣一個例子。假如我們的專案中由User這樣一個實體。我們在建立User表的時候一般包含一下屬性:

針對這個實體,我們通常需要建立一個DO類,用來封裝這個User實體。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class UserDO { private Integer id;                 //唯一主鍵 private Date createdTime;          
//建立時間 private Date updatedTime;           //最後更新時間 private String name;                //姓名 private Integer age;                //年齡 private String gender;              //性別 private String address;             //住址 private String password;            //密碼 private String nickName;           
//暱稱 private Date birthday;              //生日 private String politicalStatus;     //政治面貌,1表示群眾,2表示團員,3表示黨員,4表示其他,100表示未知 private Integer companyId;          //公司的ID private Integer status;             //資料狀態,1表示可用,0表示不可用 //setter and getter }

然後,在程式碼中,從DAO一直到前端展示,我們都通過這個UserDO類的物件來進行資料傳輸。這樣做會有什麼問題嘛?

  • 不需要的欄位也會傳遞到前端頁面。
    • 如password、createdTime、updatedTime和status這幾個欄位我們可能在前端根本不需要展示,但是這些欄位有可能也會被傳遞到前端(除非我們在SQL查詢的時候沒有查詢出對應的欄位)。這不僅使資料的傳輸量增大,還可能有安全性問題。
  • 某些欄位需要轉換,但是無法支援。
    • 對於上面例子中的政治面貌欄位,我們在資料庫中儲存的是數字,但是在前端頁面我要展示的是中文描述。這種情況只能在前端通過if/else的方式來分情況展示。
  • 某些欄位要展示,但是並不希望出現在資料庫中
    • 在User表中我們只儲存了這個使用者的companyId,需要同時查詢company表來查詢出該公司的更多詳細資訊。對於User物件,如果我們想在前端同時展示他所屬的公司,希望通過一次查詢全都查出來怎麼辦?有幾個簡單的方案,第一個是讓UserDO中包含一個Company類的屬性,通過這個屬性來傳遞。另外一種是把我們希望傳到前端的Company的屬性也寫到UserDO中。但是,如果真的這麼做了,那UserDO還能被稱作DO了嗎?

還有很多問題,這這裡就不詳細介紹了。

可見,使用一個DO從頭用到尾(從資料庫到前端頁面)並不是一種好的設計。

如何正確的使用DO、DTO、VO

對於上面的例子,我們可以將他設計成以下類。由於模型並不複雜,這裡只需要再引入VO就可以了。

UserDO已經和資料庫欄位一一對應了,這裡不需要修改。

1 2 3 4 5 6 7 8 9 10

相關推薦

DODTOVO分層設計的好處

在日常的專案開發中,VO對應於頁面上需要顯示的資料(表單),DO對應於資料庫中儲存的資料(資料表),DTO對應於除二者之外需要進行傳遞的資料。 很多人可能對VO和DTO並不是那麼熟悉,相反對DO卻比較熟悉,那是因為在很多專案中由於種種原因我們只使用了

Java中 VO PODODTO BO QODAOPOJO的概念

ati 提高 處理 應用 簡單的 setter getter 行業 相關 PO(persistent object) 持久對象 在 o/r 映射的時候出現的概念,如果沒有 o/r 映射,沒有這個概念存在了。通常對應數據模型 ( 數據庫 ), 本身還有部分業務邏輯的處理。可

Java中 VO PODODTO BO QODAOPOJO之dozer mapper使用

PO(persistant object) 持久物件 在 o/r 對映的時候出現的概念,如果沒有 o/r 對映,沒有這個概念存在了。通常對應資料模型 ( 資料庫 ), 本身還有部分業務邏輯的處理。可以看成是與資料庫中的表相對映的 java 物件。最簡單的 PO 就是對應資料庫中某個表中的一條

Java中 實體類 VO PODODTO BO QODAOPOJO的概念

PO(persistant object) 持久物件 在 o/r 對映的時候出現的概念,如果沒有 o/r 對映,沒有這個概念存在了。通常對應資料模型 ( 資料庫 ), 本身還有部分業務邏輯的處理。可以看成是與資料庫中的表相對映的 java 物件。最簡單的 PO 就是對應資料庫中某個表中的一條記錄,多個記錄可

阿裏巴巴Java開發手冊中的DODTOBOAOVOPOJO定義

nes 抽象 超過 cat dao 對象 service query 數據 分層領域模型規約: DO( Data Object):與數據庫表結構一一對應,通過DAO層向上傳輸數據源對象。 DTO( Data Transfer Object):數據傳輸對象,Service或

VO PODODTO BO QODAOPOJO在開發專案中概念

PO(persistant object) 持久物件 在 o/r 對映的時候出現的概念,如果沒有 o/r 對映,沒有這個概念存在了。通常對應資料模型 ( 資料庫 ), 本身還有部分業務邏輯的處理。可以看成是與資料庫中的表相對映的 java 物件。最簡單的 PO 就是對應

(轉)MySQL之charvarchartext的設計

SQ 數值 abc dep 添加 pos sage character AC from: http://www.cnblogs.com/billyxp/p/3548540.html 最近有表結構設計中出現了varchar(10000)的設計引起了大家的討論,我們下面就

資訊保安工作OKR願景戰略目標的設計示例

OKR是一套定義和跟蹤目標及其完成情況的管理工具和方法。本文定位於一個公司的資訊保安工作OKR設計,提供了一個設計嘗試與示例參考。幫助大家理解怎麼使用OKR來幫助設計資訊保安工作的目標和管理相關的任務。 一、願景 為公司的產品服務和技術系統的持續執行運營提供

領域驅動設計系列(2)淺析VODTODOPO的概念區別用處

服務 完全 session 並且 main 解決 業務 導致 teacher   上一篇文章作為一個引子,說明了領域驅動設計的優勢,從本篇文章開始,筆者將會結合自己的實際經驗,談及領域驅動設計的應用。本篇文章主要討論一下我們經常會用到的一些對象:VO、DTO、DO和PO。

領域驅動設計系列文章——淺析VODTODOPO的概念區別用處

本篇文章主要討論一下我們經常會用到的一些物件:VO、DTO、DO和PO。 由於不同的專案和開發人員有不同的命名習慣,這裡我首先對上述的概念進行一個簡單描述,名字只是個標識,我們重點關注其概念: 概念: VO(View Object):檢視物件,用於展示層,它的作用是把某

VODTODOPO的概念區別用處

運行時 需要 封面 數量 攔截 由於 css create ansi 轉至:http://qixuejia.cnblogs.com/ 本篇文章主要討論一下我們經常會用到的一些對象:VO、DTO、DO和PO。 由於不同的項目和開發人員有不同的命名習慣,這裏我首先對上述的概念進

關於VODTODOPO的概念區別用處(轉)

次數 博文 舉例 exce 時序 能夠 帥哥美女 一次 明顯 概念: VO(View Object):視圖對象,用於展示層,它的作用是把某個指定頁面(或組件)的所有數據封裝起來。 DTO(Data Transfer Object):數據傳輸對象,這個概念來源於J2EE的設計

淺析VODTODOPO的概念區別用處

概念:  VO(View Object):檢視物件,用於展示層,它的作用是把某個指定頁面(或元件)的所有資料封裝起來。  DTO(Data Transfer Object):資料傳輸物件,這個概念來源於J2EE的設計模式,原來的目的是為了EJB的分散式應用提供粗粒度的資料實體

Java中PODOTODTO VO BOPOJO DAO的概念

操作方法 工作經歷 世界 get 包含 程序 base 進行 需要 1.PO(persistant object) 持久對象??在 o/r 映射的時候出現的概念,如果沒有 o/r 映射,沒有這個概念存在了。通常對應數據模型 ( 數據庫 ), 本身還有部分業務邏輯的處理。可以

VODTODOPO知識點總結

lang ima 從數據 -type 所有 gpo 初始 秘密 private 1、概念: VO(View Object)     視圖對象,用於展示層,它的作用是把某個指定頁面(或組件)的所有數據封裝起來。  DTO(Data Transfer Object

Java中常見的物件型別簡述(DOBODTOVOAOPO)

這些概念用於描述物件的型別;由於java是面向物件的語言;程式的世界就是各個物件之間的“互動”;在互動的工程中會存在多個層次,每個層次中所擁有(關注)的內容都是不一樣的; PO(Persistant Object) 持久物件  用於表示資料庫中的一條記錄對映成的 java 物件。PO

四種實體類型別概念:VODTODOPO

二、領域模型中的實體類 領域模型中的實體類分為四種類型:VO、DTO、DO、PO,各種實體類用於不同業務層次間的互動,並會在層次內實現實體類之間的轉化。 業務分層為:檢視層(VIEW+ACTION),服務層(SERVICE),持久層(DAO) 相應各層間實體的傳遞如下圖: 專案中我們並沒有嚴格遵循這種傳遞關

各種概念POJOJAVABEANDAODTOPOVOBOSSHEJB

簡單 cts 取數據 bean strong 方式 不同的應用 enter 合規 轉自:https://my.oschina.net/pacoyang/blog/151695 POJO(pure old java object)是普通java類,有一些private的參數作

架構框架設計模式

們的 設計模式的 發現 使用 特定 位置 業務邏輯層 工具 如果 軟件架構是系統的一個草圖,闡述了各個組件之間的通信,層次劃分,一旦系統開始詳細設計,架構藍圖就很難甚至無法改變。 例如:三層架構:一種設計軟件架構的思想。 通常意義上的三層架構就是將整個業務應用劃分為表示層(

POPOJOBODTOVO之間的區別(轉)

per width 運行期 client 生成 swt sdn 圖片 access PO:persistent object持久對象 1 .有時也被稱為Data對象,對應數據庫中的entity,可以簡單認為一個PO對應數據庫中的一條記錄。 2 .在hibernate持久化框