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

2022-09-01 23:40:58

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

有没有更好的解决方案?不,我目前无法迁移到Hibernate或其他ORM工具。只是直接的JDBC这个项目。


答案 1

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

为了记录在案,我已经从我的词汇和代码中删除了首字母缩略词DTO。


答案 2

理想情况下,如何在数据库中存储数据,以及如何访问它们,应根据域模型中域实体之间关系的性质派生。也就是说,关系模型应遵循域模型。例如,如果您有两个实体,例如“用户”和“地址”。

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

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

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

例如,如果你的领域模型被正确定义,并且你很清楚你拥有的实体类型以及它们之间的关系,那么你的持久性(关系表及其关系,你的DAO等)将作为你在领域模型中所拥有的非常合乎逻辑的结果而发展。

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


推荐