DAO设计模式并在多个表中使用它

Cas*_*sey 18 java design-patterns jdbc java-ee

我正在寻找有关数据访问对象设计模式的反馈,并在必须跨多个表访问数据时使用它.似乎该模式具有每个表的DAO以及表示单行的数据传输对象(DTO),在处理来自多个表的数据时不太有用.我正在考虑创建一个复合DAO和相应的DTO来返回结果,比如在两个表上执行连接.通过这种方式,我可以使用SQL来获取所有数据,而不是首先使用一个DAO获取数据,而不是使用第二个DAO获取第二个数据,而不是使用Java将它们组合在一起.

有更好的解决方案吗?不,我现在无法转移到Hibernate或其他ORM工具.这个项目只是直接的JDBC.

pka*_*nen 13

我同意你的做法.我的DAO倾向于在对象级别更多地对齐,而不是从DB Table的角度来看.我可以通过DAO管理多个对象,但它们很可能是密切相关的.没有理由不让SQL访问一个DAO中的两个表.

为了记录,我从词汇和代码中删除了首字母缩略词DTO.

  • "我已经从我的词汇和代码中删除了首字母缩略词DTO." 你能解释一下吗? (3认同)
  • 我只是不明白将一个对象称为“数据传输对象”有什么意义。我直接在 DAO 中填充域对象,在我的服务中使用它们,并在我的视图中公开它们(有时我可能会创建备用视图对象)。DTO 通常没有任何行为,并且是愚蠢的财产持有者。我认为没有理由在现代 Java 项目架构中如此限制我的对象。我所说的现代,通常是指非 EJB,具有 Spring 这样的框架。 (2认同)

Naz*_*rza 5

理想情况下,您如何将数据存储在数据库中,然后如何访问它们,应该从域模型中域实体之间关系的性质中推导出来。也就是说,关系模型应该遵循领域模型。例如,如果您有两个实体,例如用户和地址。

场景#1:地址永远不会被独立访问,它们始终是用户的一个属性。在这种情况下,地址是一个值对象,用户是一个实体,并且有关于如何存储这种关系的指南。一种方法是将 Address 的 Address 属性与 User 的属性一起存储在单个表中。在这种情况下,UserDao 将处理这两个对象。

场景#2:地址可以与用户相关联,但也可以单独作为一个实体。在这种情况下,需要一种不同于第一种方法的方法。您可能有一个单独的 DAO 和地址类型表。

我的观点是,这个重要的想法经常被忽略,即域模型应该是应用程序的核心,驱动其他层。

例如,如果您的领域模型定义正确,并且您非常了解您拥有的实体类型以及它们之间的关系,那么您的持久性(关系表及其关系、您的 DAO 等)将演变为一个非常合乎逻辑的结果您在域模型中拥有的内容。

换句话说,如果您花一些时间研究您的模型,您将能够在确定如何将您的 DAO 组织到域模型中的某个位置时跟踪您的问题。如果你能在领域模型中明确定义对象的类型和它们之间关系的性质,它将帮助你解决DAL层中的问题。