拥有多个 DAO 可以吗?

Posted

技术标签:

【中文标题】拥有多个 DAO 可以吗?【英文标题】:Is it fine to have several DAOs? 【发布时间】:2018-11-05 01:24:31 【问题描述】:

假设我有一个包含两个表的数据库:companiesemployees。 如果我从这两个表中选择、更新、添加和删除,我应该创建 companyDAOemployeeDAO 吗?

或者我应该创建一个 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】:

是的,为大多数实体设置单独的DAOs 是有意义的。

您通常会使用泛型DAOs,即您有一个抽象超类。在一个简化的示例中,它可能如下所示:

class BaseDAO<T extends Entity>

提供了许多有用的方法来查找、删除或更新实体。为每个实体定义该 BaseDAO 的子类时,例如

class EmployeeDAO extends BaseDAO<Employee> 

您确保您的所有 DAO 为您必须在 BaseDAO 中实现的方法返回正确的类型。因此,EmployeeDAO 中的findAll() 方法将返回List&lt;Employee&gt;

此外,您可以为某些实体实现自定义操作的方法,例如findEmployeesWithSalaryAbove(long) 在各自的班级。您不希望这些使单个 DAO 混乱。

【讨论】:

所以总的来说,看起来我有一个抽象超类 BaseDAO,每个实体都有通用方法,而其他子类 DAO 会用自己的特定方法扩展 BaseDAO? 是的,完全正确!互联网上有各种文章可能对一般方法有所帮助,例如dzone.com/articles/dao-layer-generics-rescue 很多框架已经提供了像 Spring 等已准备好的 AbstractDaos 的解决方案。【参考方案4】:

您应该为单个 Hibernate 模型创建一个 DAO(在大多数情况下)。 模型可以是所有表列、部分表列或多个表列的组合。这完全取决于您的需求。

当您想要执行此操作时(将单个 DAO 映射实体到多个表),当您想要将休眠模型与业务模型分开时。

【讨论】:

以上是关于拥有多个 DAO 可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

JPA & JDBC 可以在 DAO 层共存吗?

dao 作为 servlet 的成员 - 正常吗?

Glassfish 管理控制台可以拥有多个具有特定权限的用户吗?

我可以使用 JavaFX 原生构建工具拥有多个可执行文件吗?

我们可以在 Kubernetes 的 Pod 中拥有相同类型的多个容器吗?

我们可以在 Mac 上拥有多个张量流版本吗?