簡體   English   中英

dao設計模式中的數據傳輸對象

[英]Data transfer object in dao design pattern

我對DTO包含哪些數據感到困惑。 例如,假設我們有兩個表:User和Orders。 Orders表包含id_users,它是用戶表的外鍵。

顯然我有兩個DAO,MysqlUserDao和MysqlOrdersDao,帶有crud操作,以及兩個傳輸對象User和Order,其中我存儲了jdbc rowset。

如果我想獲取用戶列表以及每個用戶的所有訂單,我應該怎么做:

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

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

還有一些澄清:

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

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

謝謝

在您的場景中,#1是最佳選擇,因為#2會產生過多的開銷。

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

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

2:是的。 它應該是一個普通的bean(或POJO,如果你想)。 我建議創建另一個圖層,您可以在其中定義工作流程。 我似乎有人將這個額外的層稱為模型,有時稱為DataManager,有時只是管理器。

例如:創建訂單時,您應在Order表中插入記錄,並在Notification表中插入記錄(因為每次創建訂單時都會通過電子郵件通知最終用戶)

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

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

  • “經理”可以處理許多DAO;
  • DAO不應包含其他DAO並且與DTO綁定;
  • DTO可以包含其他DTO

在處理集合時,有一個重要的想法是LAZY或EAGER加載。 但這是另一個主題:D

免責聲明:+以下假設這些DTO主要用於持久性,即用於DAO。 +這種方法非常面向關系數據庫持久性+假設用戶可以下訂單,但訂單最多只能有一個用戶+,您希望分別查詢/處理訂單和用戶

我會做以下事情:

  • 用戶的DTO(UserDTO + UserDAO)
  • 訂單DTO(OrderDTO + OrderDAO)
  • 一個DTO連接兩者(UserOrderDTO + UserOrderDAO)
  • 我不會在UserDTO中引用任何OrderDTO
  • 我可能在OrderDTO中將UserDTO引用為具有字符串id(是用戶ID的字符串id)的屬性,但我也可能沒有。 我假設后者。
  • 用於管理與訂單關聯的不同DAO的服務應用程序(OrderSA)

結果代碼如下:

class OrderManagerServiceApplication {
   private OrderDAO oDao;
   private UserDao uDao;
   private UserOrderDao uoDao;

   public saveOrder(OrderDTO o, String userId) {
      // Save the order
      Long orderId = oDao.save(o);
      // Save the association to the user who ordered
      UserOrderDTO uodto=new UserOrderDTO(orderId,userId);          
      uoDao.save(uodto);
   }

   public List<OrderDTO> getOrdersForUser(String userId) { 
      // get the orders associated to the user  
      List<String> orderIds=uoDao.getAllForUser(userId);
      // retrieve the order DTOs
      ArrayList<OrderDTO> result=new ArrayList<OrderDTO>();
      for (String orderId:orderIds){
        result.add(oDAO.getOrder(orderId));
      }
      return result;
   }


   public UserDTO getUserForOrder(Stirng orderId) { 
      // get the user associated with the order
      String userId=uoao.getUserForOrder(orderId);
      // retrieve the user DTO
      return uDAO.getUser(userId);
   }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM