通用dao架构讨论 - 最佳实践

时间:2010-01-06 01:56:17

标签: java spring dao genericdao

我想要做这个架构

genericdao + interface ---> servicelayer +接口--->查看图层

我的dao只有通用方法,我的服务层将具有实例逻辑

服务层方法

string executeThis= "select c from com.abc.test.User where username =:username";
Map tempMap = new HashMap();
tempMap.put("username","abc");
return callDaoInferface.executeGenericList(executeThis,tempMap);   //get from DI

你认为这是一个很好的架构

我的问题是,是否适合将“select ..”语句从dao移动到服务层

4 个答案:

答案 0 :(得分:3)

您使用接口几乎就像Spring一样,无论您是否使用通用DAO。它包括Web层作为视图的一部分。

我对你的服务代码并不感到骄傲。持久性接口的重点是从客户端抽象SQL,但是你已经让SELECT泄漏到你的服务层。在我看来,错了。

关于你做事的方式很少或根本没有面向对象。

我假设“通用dao”的意思是this

我已经使用Spring和Hibernate完成了它。通用DAO接口如下所示:

package persistence;

import java.io.Serializable;
import java.util.List;

public interface GenericDao<T, K extends Serializable>
{
    List<T> find();
    T find(K id);
    List<T> find(T example);

    K save(T instance);
    void update(T instance);
    void delete(T instance);
}

因此,如果我有User和Book模型对象,我可能会有两个这样的DAO:

GenericDao<User, Long> userDao = new GenericDaoImpl<User, Long>(User.class);
GenericDao<Book, String> bookDao = new GenericDaoImpl<Book, String>(Book.class);

GenericDaoImpl可能是您的练习,也可能要等到我发布源代码。

答案 1 :(得分:3)

您的架构只是一点点。

您希望dao接口抽象简洁的数据库交互,或者换句话说,您可以使用各种实现来实现数据访问协定,例如JPA,Hibernate,Oracle,JDBC等。您的查询应该驻留在实现中,你应该研究命名查询,我知道它存在于Hibernate和JPA中。查询可能因实现而异,例如db特定的细微差别(如MySQL的'限制')或HQL(Hibernate查询语言)与SQL。

在我看来,大多数情况下的服务层(比如这个)只是开销。您可能希望获得用户授权等服务,服务层可能会执行某些业务逻辑以正确构建查找。例如,您可能需要加密/解密密码,或验证用户名是否已存在,最低密码要求满意度等。

Duffy的通用DAO示例几乎是标准,我建议实现其中的变体......例如。 UserDaoHibernateImpl extends GenericDao<User, Long>

答案 2 :(得分:2)

不是,不。什么是'tempMap'呢?这看起来有点奇怪。

答案 3 :(得分:0)

现在(2016年)你应该考虑使用Spring Data JPA,而不是建立你自己的通用DAO。