2013-07-12 84 views
4

我對DTO包含的數據有點困惑。例如,假設我們有兩個表格:用戶和訂單。 Orders表包含id_users,這是用戶表的外鍵。dao設計模式中的數據傳輸對象

很明顯,我有兩個DAO,MysqlUserDao和MysqlOrdersDao,具有crud操作,以及兩個傳遞對象User和Order,其中存儲了jdbc行集。

如果我想獲得用戶併爲每個用戶自己的所有訂單,我應該怎麼辦名單:

1)在我MysqlUserDao創建一個函數:getUsersAndOrders(從用戶選擇的用戶,訂單。加入訂單) 而我的用戶DTO應該有一個OrderList屬性,我在哪裏下訂單?

2)在我的MysqlUserDao中,我創建了一個函數getAllUsers(select * from users), 和foreach用戶我使用MysqlOrdersDao函數getOrder(id_user);

而且一些澄清:

1)對於每一個在數據庫中,我需要創建一個DAO對象表?或僅僅爲複雜的? 例如產品和圖像,應該是2道還是隻有一道?

2)DTO對象應該只有性能和setter的getter,或者也可以有其他的方法,如convertEuroToUsd等

感謝

回答

3

在您的場景#1是最好的選擇,因爲#2會產生太多開銷。

1)在我的MysqlUserDao中創建一個函數:getUsersAndOrders(從用戶加入訂單中選擇用戶。,訂單)並且我的用戶DTO應該有一個OrderList屬性,我在哪裏下訂單?

說明: 1:如果你的數據庫有一個好的設計,那麼每個表的DAO是一個好方法。在某些情況下,您可以將DAO合併在一起(例如:繼承)。

2:是的。它應該是一個普通的bean(或者POJO,如果你想的話)。我建議創建另一個可以定義工作流程的圖層。我認爲人們把這個額外的層稱爲模型,有時候是DataManager,有時候只是經理。

例如:當創建一個訂單如果要在表中插入一條記錄,並在通知表中插入一條記錄

class OrderManager { 
    private OrderDAO oDao; 
    private NotificationDao nDao; 

    public saveOrder(OrderDTO o) { 
     Long orderId = oDao.save(o); 
     NotificationDTO n = new NotificationDTO(); 
     n.setType(NotificationType.ORDER_CREATED); 
     n.setEntityId(orderId); 
     nDao.save(n); 
    } 
} 
(因爲最終用戶將通過電子郵件每次創建訂單時通知)

UPDATE: 在大多數情況下,我們可以說:

  • 「經理」 可以處理很多的DAO;
  • DAO不應該包含其他DAO並且與DTO綁定;
  • 的DTO可以包含其他的DTO

有是當它涉及到處理集合懶惰,貪婪加載的一個重要思路。但這是另一個話題:D

+0

在你的例子中,我理解OrderManager的目的,但是如果我有一個簡單的DAO只是粗暴的操作,那麼管理器是毫無意義的,我想。管理器中的插入函數如下所示:'public insertOrder(OrderDto o){oDao.insert(o)); ''。通常,傳輸對象應包含所有其他處於連接關係的DTO?像orm一樣 – Catalin

+0

@Catalin「通常一個傳輸對象應該包含所有其他的處於連接關係的DTO?」。我會說這取決於,我們不能定義這樣的強大規則,有很多的性能(如果你不加入,意味着你需要循環和執行許多其他的選擇)和語義(是用戶一個秩序的內在組成部分? )您需要考慮的問題。 – Rafa