JAVA中的服务和DAO课程

时间:2018-01-24 13:02:26

标签: java design-patterns jdbc dao

我有项目客户问题的3个DAO和服务类。我还有一个 jiraService 类,我在其中使用了JIRA API。用例是我使用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方法?

3 个答案:

答案 0 :(得分:1)

  1. 为什么你在DAO中有一个服务类?您应该从JiraService类调用DAO类方法。
  2. 如果您无法创建通用方法,则应为每种情况创建不同的方法。我不认为它与DAO课程中CRUD操作的良好实践有关。
  3. 我认为为每个DAO调用提供服务方法会更好。它更清洁。您可以使用单个服务类来调用两种DAO方法。从其他DAO调用DAO可能会导致将来出现循环依赖。

答案 1 :(得分:1)

好的,首先,你不应该直接从另一个DAO类中调用一个DAO类(3),因为这会破坏安全性。 正确的是创建两个对象并从第二个实例化第一个。例如,您可以通过客户名称搜索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类上是可以的。

希望它有所帮助:)

答案 2 :(得分:1)

从上面可以看出,这个2N-Tiered设计很明显。假设如下:服务名为ProjectService,CustomerService,IssueService和JiraService; DAO类是ProjectDAO,CustomerDAO和IssueDAO。请记住,依赖性需要取决于抽象而不是具体结果。关于Solid Principles

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

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

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