Java DAO与服务层设计

Java DAO与服务层设计,java,java-ee-6,Java,Java Ee 6,我正在用JavaEE6开发web应用程序。为了尽量减少对数据库的调用,最好使用以下类: 数据访问类DAO将只调用基本方法GetAllClient、getAllProducts、getAllOrders、delete、update方法-CRUD方法 服务类,该类将调用CRUD方法,但还包括筛选方法,例如findClientByName、findProuctByType、findProductByYear、findOrderFullyPaid/NotPaid等。。。它将基于基本的DAO方法 谢谢没有

我正在用JavaEE6开发web应用程序。为了尽量减少对数据库的调用,最好使用以下类:

数据访问类DAO将只调用基本方法GetAllClient、getAllProducts、getAllOrders、delete、update方法-CRUD方法

服务类,该类将调用CRUD方法,但还包括筛选方法,例如findClientByName、findProuctByType、findProductByYear、findOrderFullyPaid/NotPaid等。。。它将基于基本的DAO方法


谢谢

没有更多的信息很难说,但我认为更好地利用数据库而不仅仅是CRUD操作可能是个好主意。数据库很擅长搜索,只要您正确配置它们,所以最好让您的数据库在find方法中为您处理搜索。这意味着您的find方法可能会出现在DAO中


考虑/意识到数据库访问对性能的影响是很好的,但不要过火。此外,您的方法意味着,由于您的服务将进行过滤,因此您将向应用程序加载大量的DB数据,这是一个坏主意。归根结底,您应该按照预期使用RDBMS,并在显示问题时担心由于过度访问而导致的性能问题。我怀疑您是否会遇到这种情况。

如果没有更多信息,很难说,但我认为,与CRUD操作相比,更好地利用数据库可能是一个好主意。数据库很擅长搜索,只要您正确配置它们,所以最好让您的数据库在find方法中为您处理搜索。这意味着您的find方法可能会出现在DAO中


考虑/意识到数据库访问对性能的影响是很好的,但不要过火。此外,您的方法意味着,由于您的服务将进行过滤,因此您将向应用程序加载大量的DB数据,这是一个坏主意。归根结底,您应该按照预期使用RDBMS,并在显示问题时担心由于过度访问而导致的性能问题。我怀疑您会遇到这种情况。

我想说,您最好让DAO比您指定的更细粒度

我建议在DAO上以某种方式放置findClientByName、findProuctByType、findProductByYear、findOrderFullyPaid/NotPay,因为您的数据库很可能比内存中的代码更擅长过滤和排序数据


假设您有10年的数据,您在服务类上调用FindProductsByEar,然后它调用getAllProducts,然后在内存中丢弃9年的数据。您最好让数据库只返回您感兴趣的年份。

我想说,您最好让DAO比您指定的更细粒度

我建议在DAO上以某种方式放置findClientByName、findProuctByType、findProductByYear、findOrderFullyPaid/NotPay,因为您的数据库很可能比内存中的代码更擅长过滤和排序数据


假设您有10年的数据,您在服务类上调用FindProductsByEar,然后它调用getAllProducts,然后在内存中丢弃9年的数据。最好让数据库只返回您感兴趣的年份。

根据我的经验,有限的DAO类往往具有应用程序可以执行的所有可能的数据库操作。因此,在您的情况下,它将具有诸如GetAllClient和getClientByNameString name等方法

在DAO中获取所有用户并对其进行迭代,直到找到所需的用户,这将导致不必要的计算时间浪费和内存消耗

如果您想减少数据库被访问的次数,您可以实现一些缓存机制。一个框架,如图所示,应该能够提供您所需要的内容

编辑:

根据您的评论问题,不,您的服务不会被冗余。我们通常使用服务层来公开DAO功能。这基本上不会使DAO从应用程序前端可见。它通常还允许使用额外的方法,例如,公共字符串getUserFormattedString用户名。这将利用DAO提供的getUserByName函数,但提供一些额外的功能

如果规范发生变化,并且您现在还需要一个web服务来与您的应用程序接口,那么服务层也将使自己变得有用。中间有一个服务层将允许web服务通过服务层查询DAO

所以基本上,DAO层仍然会担心数据库的问题
CRUD操作,而服务将在不公开DAO的情况下调整DAO返回的数据。

根据我的经验,有限的DAO类往往具有允许应用程序执行的所有可能的数据库操作。因此,在您的情况下,它将具有诸如GetAllClient和getClientByNameString name等方法

在DAO中获取所有用户并对其进行迭代,直到找到所需的用户,这将导致不必要的计算时间浪费和内存消耗

如果您想减少数据库被访问的次数,您可以实现一些缓存机制。一个框架,如图所示,应该能够提供您所需要的内容

编辑:

根据您的评论问题,不,您的服务不会被冗余。我们通常使用服务层来公开DAO功能。这基本上不会使DAO从应用程序前端可见。它通常还允许使用额外的方法,例如,公共字符串getUserFormattedString用户名。这将利用DAO提供的getUserByName函数,但提供一些额外的功能

如果规范发生变化,并且您现在还需要一个web服务来与您的应用程序接口,那么服务层也将使自己变得有用。中间有一个服务层将允许web服务通过服务层查询DAO


因此,基本上,DAO层仍将担心数据库的CRUD操作,而服务将在不公开DAO的情况下调整DAO返回的数据。

是的,这是正确的方法


服务将拥有这些事务。你应该把它们写成pojo;通过这种方式,您可以将它们公开为SOAO或REST web服务、EJB或以后需要的任何其他内容。

是的,这是正确的方法


服务将拥有这些事务。你应该把它们写成pojo;这样,您可以将它们公开为SOAO或REST web服务、EJB或您以后想要的任何其他内容。

那么我的服务类会是多余的吗,因为我也会有java beans类?所以服务类也适用于生成pdf销售报告的方法?@alex:是的,您可以有类似的东西,这意味着在DAO中,您将有适当的方法来提取数据,在服务中,您将有方法来构造DAO。这将确保DAO只负责DB操作,而服务提供其他功能(在本例中为格式化功能)。@alex:不用担心。另外,在我之前的评论中,我有一个输入错误,在服务中,您将拥有构造DAO的方法。应该是在服务中,您将有方法来构建报告。那么我的服务类是否会冗余,因为我也将有java beans类?那么服务类也将适合于生成pdf销售报告的方法?@alex:是的,您可以有类似的东西,这意味着在DAO中,您将有适当的方法来提取数据,在服务中,您将有方法来构造DAO。这将确保DAO只负责DB操作,而服务提供其他功能(在本例中为格式化功能)。@alex:不用担心。另外,在我之前的评论中,我有一个输入错误,在服务中,您将拥有构造DAO的方法。应该在服务中,您将拥有构造报表的方法。