Java DAO设计模式及其在多个表中的使用

Java DAO设计模式及其在多个表中的使用,java,design-patterns,jdbc,jakarta-ee,Java,Design Patterns,Jdbc,Jakarta Ee,我正在寻找有关设计模式的反馈,并在需要跨多个表访问数据时使用它。在处理来自多个表的数据时,这种模式似乎不太有用,因为每个表都有一个DAO以及一个表示一行的数据传输对象(DTO)。我在考虑创建一个复合DAO和相应的DTO,它将返回对两个表执行连接的结果。通过这种方式,我可以使用SQL获取所有数据,而不是首先使用一个DAO从一个表中获取数据,然后使用第二个DAO从第二个表中获取数据,然后用Java将它们组合在一起 有更好的解决办法吗?不,我现在不能移动到Hibernate或其他ORM工具。对于这个项

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


有更好的解决办法吗?不,我现在不能移动到Hibernate或其他ORM工具。对于这个项目,直接使用JDBC

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


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

理想情况下,您在数据库中存储数据的方式以及访问数据的方式,应该从您的域模型中的域实体之间的关系的性质中派生出来。也就是说,关系模型应该遵循域模型。例如,如果您有两个实体,例如,User和Address

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

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

我的观点是,这一重要思想往往被忽略,即域模型应该是应用程序的核心,驱动其他层

例如,如果您的域模型被正确定义,并且您清楚地知道您拥有的实体的类型以及它们之间的关系,那么您的持久性(关系表及其关系、DAO等)将作为您在域模型中拥有的东西的一个非常合逻辑的结果而发展


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

“我已经从词汇表和代码中排除了首字母缩写DTO。”您能解释更多吗?我只是不认为将对象称为“数据传输对象”有什么意义。我直接在DAO中填充域对象,在服务中使用它们,并在视图中公开它们(有时我可能创建备用视图对象)。DTO通常没有行为,是哑属性持有者。我不认为有理由在现代Java项目体系结构中如此限制我的对象。说到现代,我通常指的是非EJB,有一个像Spring这样的框架。和我使用它们的方式差不多。谢谢。这是最好的做法吗?因此,在DAO中,您将拥有getAnwhere(),它调用getSomethingElse()来构造任何东西。我觉得这很容易出错,因为排序在插入和更新中都非常重要。你能举个例子说明为什么这很容易出错吗?我很难想象它。