[英]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);
}
}
更新:在大多數情況下,我們可以說:
在處理集合時,有一個重要的想法是LAZY或EAGER加載。 但這是另一個主題:D
免責聲明:+以下假設這些DTO主要用於持久性,即用於DAO。 +這種方法非常面向關系數據庫持久性+假設用戶可以下訂單,但訂單最多只能有一個用戶+,您希望分別查詢/處理訂單和用戶
我會做以下事情:
結果代碼如下:
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.