JAVA 中的服务和 DAO 类

Service and DAO classes in JAVA

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

  1. 我应该如何从 jiraService class 调用 DAO classes?我在服务 class 中直接调用所需的 DAO class 好吗,还是应该通过我为该 DAO class 创建的服务 class 调用它? ?
  2. DAO classes 应该只包含 CRUD 方法。但是 say READ 操作可能会有变化。例如,我可能想根据客户名称或问题 ID 或两者来获取项目。我们不能为此创建通用的 GET 方法。那么,在 DAO classes 中包含所有 required CRUD 操作的变体被认为是一种好的做法吗?
  3. 一个 DAO class 应该如何调用另一个 DAO class 中的方法?例如,我有客户名称,我正在获取该客户的所有项目信息。在我的项目 table 中,我存储了 customerId,因此我需要先获取该客户的 customerID,然后使用客户 ID 从项目 table 中获取所有项目。我应该如何从 projectDAO class?
  4. 调用 customerDAO 中的 getCustomerID 方法
  1. 为什么你在 DAO 中有一个服务 class?您应该从 JiraService class.
  2. 调用 DAO class 方法
  3. 如果您不能创建通用方法,您应该为每种情况创建不同的方法。我认为它与 DAO 中 CRUD 操作的良好实践没有任何关系 classes.
  4. 我认为最好为每个 DAO 调用提供服务方法。它更干净。您也许可以使用单个服务 class 来调用两个 DAO 方法。从其他 DAO 调用 DAO 将来可能会导致循环依赖。

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

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

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 调用 DAO 对象 class (1) 因为这不会影响您的代码。

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

希望对您有所帮助:)

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

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

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

3 需要定义实体之间的关系。 JPA 可用于实现此目的。另一种方法是拥有一个 DAO,它从相关表中检索所有数据并将数据映射到 Model/Value 对象 - 示例客户、项目。