2016-03-03 121 views
4

我的應用程序基於典型的三層體系結構,目標是創建一個SpringMVC站點和一個Spring Batch解決方案,用於提供和維護我們的數據庫產品和庫存,其中速度是一個非常重要的因素。DTO,DAO或服務層?

我使用Spring的JdbcTemplate來管理遺留數據庫。我的一些表格包含很多不使用的列,並且由於某些字段(我們甚至不需要映射的斑點)的大小,檢索整行已經顯示出負面影響,所以我創建了一些與列我想要檢索,如:

  • 產品 - 包含一個1:與存儲在數據庫中的字段1的關係。
  • ProductDetailsView - 包含ID,名稱,價格,描述,庫存。
  • ProductListItemView - Id,Price,name,stock。

DAO層將這些bean返回到服務層。據我所知創建DTO揭露它在我的服務接口產品可能是有意義的,但是,

1)什麼ProductDetailsViewProductListItemView

2)我應該從這些'視圖'或'投影'到具有相同屬性的DTO進行1:1映射嗎?爲什麼?

3)無論如何,你會在哪裏放置JSR-303註釋來驗證網絡的輸入?

回答

2

通常情況下,DTO的使用是由於將實體從視圖中分離出來,然後數據庫中的任何內部更改都不會影響視圖或客戶端,視圖也不需要進行任何更改。除非你需要發送更多或不同的信息。但是你沒有使用jdbctemplate使用JPA,因此你的對象可以作爲DTO立即行爲,因爲你沒有綁定到數據庫模型。

對於產品實體來說,創建DTO似乎是一種好方法,因爲您的視圖對象只是存儲在數據庫中的整個對象的部分表示。

  1. 我看到有在ProductDetailsView和ProductListItemView有列的最小數目,(可能你只是把一組),如果你認爲你不會有在表的定義太大的變化,因爲它們是不是那麼大,你可以使用像休息存儲庫方法的實體對象。

  2. 預測也是一種解決相同需求的不同方法,避免將不重要的信息發送到視圖,但是您將在同一個POJO中包含jackson註釋和jpa註釋。 (當你使用ORM時這更多)。人們不那麼喜歡那樣,這就是爲什麼創建DTO的原因。通常,JSR303註釋屬於'輸入'對象,它們在它們到達控制器後立即進行檢查,您可以使用@Validated批註在springmvc和jsr中發揮得很好,這用於屬於你的端點的方法。

我覺得沒有金科玉律,但我會盡力去耦數據庫層的多,我可以的視圖。而且,當您使用jdbcTemplate時,您不必擔心帶來整個表示或者對錶的渴望/懶惰集合存在問題,因爲您始終可以修改投影以使用獲取您將使用的內容。考慮從DAO帶來的DTO,你將發送到視圖並使用相同的輸入對象在您的CRUD操作

+1

您好,感謝您真正有用的答案,真的很感激它。 在我們使用DAO中檢索到的結果作爲中間DTO的情況下,我們需要服務層中的特定DTO(假設我們需要在服務層中添加一些計算的字段到實體的這些縮小版本中的一個),我們將在哪裏放置以及如何在項目中命名這兩種類型的DTO? 一些例子我能想到的現在: 'org.company.project.catalog.model.view.ProductListItemView' 'org.company.project.catalog.dto.ProductListItemDto' 'org.company.project。 common.dto.ProductListItemDto' – Computist

+2

如果你是我,我使用POJO將我需要的服務層(存儲計算值)的所有屬性+我從數據庫中檢索的屬性,我將完全用它來調用它model.jdbc包中的數據庫表的名稱。我將發送給視圖的DTO使用第一個POJO值來將所需值移動到表示層,並且在此DTO中定義json註釋或視圖註釋,我將把這個DTO放入應用程序模塊中的dto文件夾中包 – Koitoer