3级架构中的DAO模式。如何处理复杂的查询

时间:2014-05-18 12:00:17

标签: java spring dao spring-jdbc

我目前正在使用3层ui-service-dao开发应用程序。在dao级别,我使用的是Spring的jdbcTemplate。到目前为止这么好,但我遇到了一种情况,我希望有更多的见解

我的DAO在初始化时只有简单的CRUD方法。在服务级别,我检查输入值并委托给DAO并处理事务。

现在我需要的东西更像下面这个

列出getAllBooksByAuthorName(字符串名称)

我的问题是在哪里放这个?在DAO层使用sql或在服务中使用CRUD的核心方法并简单地在java中计算

我倾向于尽可能多地使用sql而不是在服务层进行计算。但是现在看起来对于每个新方法,我还需要更改DAO的接口并在服务的接口中制作相应的方法。然后服务只不过是一个委托和参数检查器。感觉不对。

3 个答案:

答案 0 :(得分:2)

你的意见非常有效,但我没有得到多少为什么你有疑问。一般来说,DAO模式减少了业务逻辑和持久性逻辑之间的耦合。

public interface BooksDAO{
   public boolean save(Book book);
   public boolean update(Book book);
   public boolean findByBookIsbn(int isbn);
   public boolean delete(Book book);
   //here is what you want
   public List<Book> getAllBooksByAuthorName(String name);
}

现在,您可以为BooksDao实现不同的实现,如HibernateBooksDaoImpl或JdbcBooksDAOImpl。 DAO模式可以轻松编写隔离的junit测试并执行得更快。

如果您有复杂的查询,您仍然可以使用dao模式。基本上有方法在实现端编写复杂查询,无论是简单的jdbc(可以使用sql)还是spring jdbc模板(仍然可以使用sql)或者hibernate使用标准。 看到: http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/Criteria.html

有关详细信息,请参阅:

http://javarevisited.blogspot.com/2013/01/data-access-object-dao-design-pattern-java-tutorial-example.html
http://www.oracle.com/technetwork/articles/entarch/spring-jdbc-dao-101284.html

答案 1 :(得分:1)

然而,它应该如何。除了调用DAO方法之外,业务逻辑被简化为任何东西,那么你很幸运拥有简单的业务逻辑。

使用服务调用BookDAO.findAll()并过滤DAO返回的大量书籍列表显然是非常低效且完全不现实的。 SQL是适合这项工作的正确工具。

请注意,只有接口可以进行模拟的日子已经过去了。使用界面来定义DAO方法不再是必要的了。

答案 2 :(得分:0)

例如,您可以使用Entity-Control-Boundary-Pattern。

您的包结构如下所示:

在您的应用程序的命名空间下,您可以引入一个名为“business”的包,在该包中可以有由业务职责指定的包,这些包分为“实体”,“控制”和“边界”。 / p>

com.example.myapplication.business.project.entity - &gt;如果您使用JPA,则所有实体都可以存储在此包中,包含DTO

com.example.myapplication.business.project.control - &gt;在这个包中可以存储重构的服务,例如,如果需要DAO-Code不仅仅是一个边界,那么代码可以在这个包中重构

com.example.myapplication.business.project.boundary - &gt;此程序包包含客户端可以看到的所有服务(例如您的网页)

在“演示文稿”包中,您的ui控制器可以存储,ui控制器只能访问存储在边界包中的服务。

com.example.myapplication.presentation.project

通过使用此模式,您可以避免使用委托者,因为存储在boundary-package中的服务也可以包含特定于sql的内容,并且所有服务和实体都在它们所属的包中。

该模式也可以在JEE之外使用。 Adam Bien在JEE-Architecture中彻底改变了这种模式,我也在自己的项目中使用它。这是一个例子 - &gt; http://www.youtube.com/watch?v=JWcoiXNoKxk#t=2380

您的边界方法可能如下所示:

public interface ProjectService {
public Project createProject(Project project);
public Project getProjectById(String projectId);
public List<Project> getProjectList(ListConfig config); // where ListConfig is a class containing information of how the list should be sorted, optional pagination information, etc, so that the interface must not be changed every time you need a new parameter
public Project updateProject(Project project);
public void deleteProject(String projectId);
public Project addFeature(Project project, Feature feature);

}

@ayan ahmedov:对不起,我第一次尝试回答您的问题时,我很遗憾地编辑了您的问题,我的回答是在您问题的内容区域。我已经“改变了”意外的变化。