dao设计模式中的数据传输对象

Cat*_*lin 5 java dao design-patterns

我对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等.

谢谢

Raf*_*afa 4

在您的场景中,#1 是最佳选择,因为#2 会产生太多开销。

1)在我的MysqlUserDao中创建一个函数:getUsersAndOrders(select users.,orders.from users join order)并且我的用户DTO应该在我下订单的地方有一个OrderList属性?

说明: 1:如果您的数据库有良好的设计,那么每个表都有一个 DAO 是一个好方法。在某些情况下,您可以将 DAO 合并在一起(例如:继承)。

2:是的。它应该是一个普通的 bean(或者 POJO,如果你愿意的话)。我建议创建另一个层,您可以在其中定义您的工作流程。我似乎有人将这个额外的层称为模型,有时称为数据管理器,有时只是管理器。

例如:创建订单时,您应该在订单表中插入一条记录,并在通知表中插入一条记录(因为每次创建订单时都会通过电子邮件通知最终用户)

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

更新: 在大多数情况下我们可以说:

  • “管理者”可以处理许多 DAO;
  • DAO 不应包含其他 DAO 并与 DTO 绑定;
  • DTO 可以包含其他 DTO

在处理集合时,有一个重要的想法是“LAZY”或“EAGER”加载。但这是另一个主题了:D