我目前正在使用3层ui-service-dao开发应用程序。在dao级别,我使用的是Spring的jdbcTemplate。到目前为止这么好,但我遇到了一种情况,我希望有更多的见解
我的DAO在初始化时只有简单的CRUD方法。在服务级别,我检查输入值并委托给DAO并处理事务。
现在我需要的东西更像下面这个
列出getAllBooksByAuthorName(字符串名称)
我的问题是在哪里放这个?在DAO层使用sql或在服务中使用CRUD的核心方法并简单地在java中计算
我倾向于尽可能多地使用sql而不是在服务层进行计算。但是现在看起来对于每个新方法,我还需要更改DAO的接口并在服务的接口中制作相应的方法。然后服务只不过是一个委托和参数检查器。感觉不对。
答案 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:对不起,我第一次尝试回答您的问题时,我很遗憾地编辑了您的问题,我的回答是在您问题的内容区域。我已经“改变了”意外的变化。