2014-05-18 20 views
2

我目前正在开发一个使用3层ui-service-dao的应用程序。在dao级别,我使用Spring的jdbcTemplate。到目前为止这么好,但我遇到了一个我喜欢有更多见解的情况。3层架构中的DAO模式。如何处理复杂的查询

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

现在我需要的东西更喜欢下面这一个

列表getAllBooksByAuthorName(字符串名称)

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

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

回答

1

然而,它应该如何。在业务逻辑中,除了调用DAO方法外,其他任何东西都可以简化为零,那么你很幸运有简单的业务逻辑。

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

请注意,模拟只能用于接口的日子已过去。使用界面来定义你的DAO方法并不是真的有必要了。

0

例如,您可以使用实体控制边界模式。

你的包结构如下所示:

下,您可能会引入了一个叫做“业务”,在包有可能是由业务负责命名的包和这些包分隔应用程序的命名空间分为“实体”,“控制”和“边界”。

com.example.myapplication.business.project.entity - >如果你正在使用JPA所有的实体可以存储在这个包,包含DTO的

com.example.myapplication.business.project.control - >在这个包中可以存储重构服务,例如,如果需要在不止一个边界中使用DAO代码,代码可以在此包中重构

com.example.myapplication.business.project.boundary - >此软件包包含客户可以看到的所有服务(例如您的网页)

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

com.example.myapplication.presentation.project

通过使用这种模式你避免使用委托者,因为存储在边界包的服务还可以包含SQL特定的东西,所有的servies和实体在他们所属的包装中。

该模式也可以在JEE之外使用。 Adam Bien在JEE架构中彻底改变了这种模式,我也在自己的项目中使用它。下面是一个例子 - >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:对不起,我第一次尝试回答你的问题,我不幸编辑你的问题,我的回答是在你的问题的内容领域。我'恢复了'意外的变化。

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