拥有多个 DAO 可以吗?
Posted
技术标签:
【中文标题】拥有多个 DAO 可以吗?【英文标题】:Is it fine to have several DAOs? 【发布时间】:2018-11-05 01:24:31 【问题描述】:假设我有一个包含两个表的数据库:companies
和 employees
。
如果我从这两个表中选择、更新、添加和删除,我应该创建 companyDAO
和 employeeDAO
吗?
或者我应该创建一个 DAO,在其中我将为数据库中的每个表编写 CRUD 操作的方法?
【问题讨论】:
【参考方案1】:为整个数据库创建一个 DAO 不能很好地扩展。添加的数据库表越多,它就越大。在工业中,您几乎总是会看到一对一的 DAO 与表的关系。与往常一样,有例外和警告。
【讨论】:
同意。但我更愿意说每个 entity 或每个 class 都有一个 DAO,而不是每个 table,因为您通常没有多对多关系中关系表的 DAO。而且,它更适合面向对象的方法。【参考方案2】:顾名思义,代表数据访问对象的DAO是一个访问ONE对象或类的实体。为每个业务实体拥有一个 DAO 是标准的软件工程和企业行业(尤其是 Java)最佳实践。
如果您在多个 DAO 中重用相似的行为和数据,通常可以方便地创建一个基本 DAO 并由其他 DAO 扩展它。
另请阅读https://en.wikipedia.org/wiki/Data_access_object
【讨论】:
【参考方案3】:是的,为大多数实体设置单独的DAO
s 是有意义的。
您通常会使用泛型DAO
s,即您有一个抽象超类。在一个简化的示例中,它可能如下所示:
class BaseDAO<T extends Entity>
提供了许多有用的方法来查找、删除或更新实体。为每个实体定义该 BaseDAO 的子类时,例如
class EmployeeDAO extends BaseDAO<Employee>
您确保您的所有 DAO 为您仅必须在 BaseDAO 中实现的方法返回正确的类型。因此,EmployeeDAO 中的findAll()
方法将返回List<Employee>
。
此外,您可以为某些实体实现自定义操作的方法,例如findEmployeesWithSalaryAbove(long)
在各自的班级。您不希望这些使单个 DAO 混乱。
【讨论】:
所以总的来说,看起来我有一个抽象超类 BaseDAO,每个实体都有通用方法,而其他子类 DAO 会用自己的特定方法扩展 BaseDAO? 是的,完全正确!互联网上有各种文章可能对一般方法有所帮助,例如dzone.com/articles/dao-layer-generics-rescue 很多框架已经提供了像 Spring 等已准备好的 AbstractDaos 的解决方案。【参考方案4】:您应该为单个 Hibernate 模型创建一个 DAO(在大多数情况下)。 模型可以是所有表列、部分表列或多个表列的组合。这完全取决于您的需求。
当您想要执行此操作时(将单个 DAO 映射实体到多个表),当您想要将休眠模型与业务模型分开时。
【讨论】:
以上是关于拥有多个 DAO 可以吗?的主要内容,如果未能解决你的问题,请参考以下文章
Glassfish 管理控制台可以拥有多个具有特定权限的用户吗?
我可以使用 JavaFX 原生构建工具拥有多个可执行文件吗?