【问题标题】:Service and DAO classes in JAVAJAVA 中的服务和 DAO 类
【发布时间】:2018-07-03 12:58:27
【问题描述】:

我有 3 个用于 projectcustomerissues 的 DAO 和服务类。我还有一个使用 JIRA API 的 jiraService 类。用例是我使用 API 在 JIRA 中为客户的项目创建问题。创建问题后,我会存储客户信息。在客户表中,响应信息。从问题表中的 JIRA 然后将问题 ID、客户 ID 存储在项目表中,以便我知道哪个问题与哪个客户和项目相关。现在我有一些问题-

  1. 我应该如何从 jiraService 类中调用 DAO 类?像我在服务类中一样直接调用所需的 DAO 类好还是应该通过我为该 DAO 类创建的服务类调用它?
  2. DAO 类应该只包含 CRUD 方法。但是说 READ 操作可能会有所不同。例如,我可能想根据客户名称或问题 ID 或两者来获取项目。我们不能为此创建一个通用的 GET 方法。那么在 DAO 类中包含所有必需的 CRUD 操作变体是否被认为是一种好习惯?
  3. 一个 DAO 类应该如何调用另一个 DAO 类中的方法?例如,我有客户名称,我正在获取该客户的所有项目信息。在我的项目表中,我存储了 customerId,因此我需要首先获取该客户的 customerID,然后使用客户 ID 从项目表中获取所有项目。我应该如何从 projectDAO 类调用 customerDAO 中的 getCustomerID 方法?

【问题讨论】:

  • 你读过DAO Pattern吗?
  • @J_D 我从多个来源阅读了 DAO 模式。但这对我正在寻找的东西没有帮助。
  • 当人们在没有提及任何理由的情况下投反对票时,我不明白。这就是为什么有 cmets 以便您可以告诉您的 POV。如果缺少某些内容,请提及,以便提问者可以考虑并可能学到一些东西。

标签: java design-patterns jdbc dao


【解决方案1】:

从上面可以看出,这种2N-Tiered设计。假设如下:服务被命名为 ProjectService、CustomerService、IssueService 和 JiraService; DAO 类是 ProjectDAO、CustomerDAO 和 IssueDAO。请记住,依赖需要依赖于抽象而不是具体。 Solid Principles上的好文章

  1. JiraService 的目的是通过使用 API 来更新 JIRA。从 JiraService 保存到数据访问层可能并不谨慎,因为这违反了single responsibility principle

    • 一个。调用 JiraService 的控制器类。完成时控制是 返回控制器
    • 乙。然后控制器可以调用任何 其他服务(ProjectService、CustomerService、IssueService) 它连接 DAO 层(最好通过接口,例如 IProjectDAO)来持久化数据。
  2. 一些继承的时间 - 父类将具有基本的 CRUD 操作 - 例如 BaseDAO,它可以被所有子 DAO 类扩展。可以将特定行为添加到子类中。示例:CustomerDAO.getCustomerByID()、CustomerDAO.getCustomersBySurname()。

3 需要定义实体之间的关系。 JPA 可以用来实现这一点。另一种方法是使用 DAO 从相关表中检索所有数据并将数据映射到模型/值对象 - 示例客户、项目。

【讨论】:

    【解决方案2】:
    1. 为什么在 DAO 中有一个服务类?您应该从 JiraService 类中调用 DAO 类方法。
    2. 如果您无法创建通用方法,您应该为每种情况创建不同的方法。我认为这与 DAO 类中 CRUD 操作的良好实践无关。
    3. 我认为最好为每个 DAO 调用提供服务方法。干净多了。您也许可以使用单个服务类来调用这两个 DAO 方法。从其他 DAO 调用 DAO 将来可能会导致循环依赖。

    【讨论】:

      【解决方案3】:

      好的,首先,您不应该直接从另一个 (3) 调用一个 DAO 类,因为这会破坏安全性。 正确的做法是创建两个对象并从第二个实例化第一个。例如,您可以通过客户名称搜索您的 customerID,并将其存储在您的 customerDAO 对象中。然后,使用该信息获取该客户在 projectDAO 对象上的所有项目,使用来自 customerDAO 对象的信息,但不直接将 customerDAO 调用到 de projectDAO 对象中,因为这会依赖 projectDAO。

      您希望它们尽可能独立,因此您将它们连接到另一个用作控制器的类上,例如您的 jiraService 类。这样,代码的外观应该是这样的:

      CustomerDAO cdao= new CustomerDAO();
      ProjectDAO pdao = new ProjectDAO();
      //I will suppose that you used numeric ID and use a long variable to store the result
      long id=cdao.getCustomerID("MyCustomerName");//This is just an example
      List<Project> lp= pdao.getProjectsByCusID(id);
      

      然后,话虽如此,您只需要从 jour jiraService 类 (1) 调用 DAO 对象,因为这不会影响您的代码。

      最后,正如您之前所说,DAO 应该包含 CRUD 方法 (2),这意味着您可以实现您认为会使用的每一个 CRUD 方法。 如果你认为你需要一个 getProjectsByName(String) 方法,只需实现它,就可以了,就像你自己的代码一样,并且是一个 CRUD 方法,所以在 DAO 类上也可以。

      希望它有所帮助:)

      【讨论】:

        猜你喜欢
        • 2014-08-15
        • 2012-01-06
        • 2014-12-04
        • 2013-05-27
        • 2018-01-11
        • 1970-01-01
        • 2015-08-31
        • 2016-05-19
        • 2017-06-07
        相关资源
        最近更新 更多