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

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

或者我应该创建一个 DAO,在其中我将为数据库中的每个表编写 CRUD 操作的方法?

【问题讨论】:

    标签: java mysql dao


    【解决方案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 映射实体到多个表),当您想要将休眠模型与业务模型分开时。

      【讨论】:

        猜你喜欢
        • 2011-04-25
        • 1970-01-01
        • 2015-06-18
        • 2012-02-17
        • 2020-12-19
        • 2014-03-16
        • 1970-01-01
        • 2013-12-16
        • 1970-01-01
        相关资源
        最近更新 更多