我对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等。
感谢
答案 0 :(得分:4)
在您的场景中,#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
答案 1 :(得分:0)
声明: +以下假定这些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);
}
}