繁体   English   中英

JAVA中的服务和DAO类

[英]Service and DAO classes in JAVA

我有3个DAO和服务类,分别针对项目客户问题 我还有一个使用JIRA API的jiraService类。 用例是我使用API​​在JIRA中为客户的项目创建问题。 创建问题后,我将存储客户信息。 客户表中的响应信息。 从JIRA发布到问题表中,然后将问题ID,客户ID存储在项目表中,这样我就知道哪个问题与哪个客户和项目有关。 现在我有一些问题-

  1. 我应该如何从jiraService类调用DAO类? 直接像我在服务类中那样直接调用所需的DAO类,还是应该通过为该DAO类创建的服务类来调用它?
  2. DAO类应该仅包含CRUD方法。 但是说操作可能有所不同。 例如,我可能想根据客户名称或问题ID或两者来获取项目。 我们无法为此创建通用的GET方法。 那么在DAO类中包括所有所需的CRUD操作变体是否被视为一种好习惯?
  3. 一个DAO类应如何在其他DAO类中调用方法? 例如,我有一个客户名称,并且正在获取该客户的所有项目信息。 在我的项目表中,我存储了customerId,因此我需要首先获取该客户的customerID,然后使用客户ID从项目表中获取所有项目。 我应该如何在projectDAO类的customerDAO中调用getCustomerID方法?
  1. 为什么在DAO中有一个服务课程? 您应该从JiraService类中调用DAO类方法。
  2. 如果无法创建通用方法,则应为每种情况创建不同的方法。 我认为这与DAO类中CRUD操作的良好实践无关
  3. 我认为最好为每个DAO调用提供服务方法。 干净得多。 您也许可以使用单个服务类来调用这两个DAO方法。 从其他DAO调用DAO可能会在将来导致循环依赖。

好的,首先,您不应该直接从另一个(3)调用一个DAO类,因为那样会破坏安全性。 正确的方法是创建两个对象,然后从第二个实例化第一个。 例如,您通过按客户名称搜索到的customerID,并与customerDAO对象一起存储。 然后,使用该信息,您可以使用来自customerDAO对象的信息,在projectDAO对象上获取该客户的所有项目,但不直接将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类上也可以。

希望它有帮助:)

从上面可以明显看出,这种2N层设计。 假定以下内容:服务分别命名为ProjectService,CustomerService,IssueService和JiraService; DAO类是ProjectDAO,CustomerDAO和IssueDAO。 请记住,依赖关系必须依赖于抽象而不是依赖。 关于扎实原则的不错的文章

  1. JiraService的目的是通过使用API​​来更新JIRA。 从JiraService保存到数据访问层可能并不明智,因为这违反了单一责任原则

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM