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.
理想情况下,您如何将数据存储在数据库中,然后如何访问它们,应该从域模型中域实体之间关系的性质中推导出来。也就是说,关系模型应该遵循领域模型。例如,如果您有两个实体,例如用户和地址。
场景#1:地址永远不会被独立访问,它们始终是用户的一个属性。在这种情况下,地址是一个值对象,用户是一个实体,并且有关于如何存储这种关系的指南。一种方法是将 Address 的 Address 属性与 User 的属性一起存储在单个表中。在这种情况下,UserDao 将处理这两个对象。
场景#2:地址可以与用户相关联,但也可以单独作为一个实体。在这种情况下,需要一种不同于第一种方法的方法。您可能有一个单独的 DAO 和地址类型表。
我的观点是,这个重要的想法经常被忽略,即域模型应该是应用程序的核心,驱动其他层。
例如,如果您的领域模型定义正确,并且您非常了解您拥有的实体类型以及它们之间的关系,那么您的持久性(关系表及其关系、您的 DAO 等)将演变为一个非常合乎逻辑的结果您在域模型中拥有的内容。
换句话说,如果您花一些时间研究您的模型,您将能够在确定如何将您的 DAO 组织到域模型中的某个位置时跟踪您的问题。如果你能在领域模型中明确定义对象的类型和它们之间关系的性质,它将帮助你解决DAL层中的问题。