我想要做这个架构
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移动到服务层
答案 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。