论坛首页 Java企业应用论坛

只需要一个DAO,是个好主意吗?

浏览 48388 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-11  
我能想到的有下面几点缺陷

1:DAO 理论上只负责数据访问逻辑而并不封装service,所以理论上说封装成一个Dao是可行的,但是实际操作过程中,您可能要面对下面的几个问题

a) 修改/删除/添加接口里面的方法后,所有的service都受影响。业界术语好像叫什么高耦合不可控。
b) 接口缺乏物理上的分离,类的职责界限不明确
c) 函数命名困难
d) 线程控制

似乎上面的问题是您最直接要面对的问题
0 请登录后投票
   发表时间:2008-11-11  
wolfwolfgod 写道
目前的J2EE架构中,大多都有DAO层,在我们的项目实践中也是这样,而且由于使用了Hibernate或者Ibatis这样的持久层框架,把SQL都放在了外部的XML文件中,由一个ID来引用。
现在的问题是,大多数的情况下,在DAO中我们只是简单传参数,然后运行指定ID的SQL/HQL,所以有同仁提出,建立一个单一的DAO类,封装了基本的操作,然后在Service层都引用这个DAO,直接传SQL-ID和查询参数,就不用写那么多DAO类了,可我觉得这样就不是一个DAO层了,退化为一个类似工具类的东西,所以放在这里大家讨论一下,此方式有何优缺点或不妥的地方。

最近我做的一个项目开始是和楼主一样的想法,弄一个通用的Dao供Service层调用,也就是说整个系统:一个Dao,service层,action层,随着项目的实施,发现service层之间的内部调用越来越多,甚至两个service之间的互相调用,看着心里觉得越来越乱,然后就决定把service分为两层:把一些service中公用的方法提取为一层,这一层的名字我很自然就叫做dao层。因此,我得出一个结论:项目业务比较简单像楼主这样做完全没有问题(甚至连service层都可以不要,直接Action层调用通用的Dao),随着项目业务的复杂度的增加,为了减少层内部的调用关系,还是会划分出很多层。而且很自然把某一层叫做dao层。
0 请登录后投票
   发表时间:2008-11-11  
可以考虑用泛型减化成一个基础的dao,如果特殊需求再单独写以便区分
0 请登录后投票
   发表时间:2008-11-11  
我已经丢弃DAO了,因为我发现如果使用DAO,会产生很多代码(虽然可以自动生成),而且用不好Hibernate,会很影响效率
0 请登录后投票
   发表时间:2008-11-11  
ywlqi 写道
我现在就是用一个dao,sql写在service层里当作参数传递给dao
我对此的解释是service是业务逻辑层,sql也是根据业务决定的,所以sql放在service层是理所当然的
到目前为止这种模式用的很爽

同意楼上,我现在也是用一个dao
0 请登录后投票
   发表时间:2008-11-11  
我觉得不管是一个DAO也好,是多个DAO也好,最重要的是针对你这个项目,当然,在大部分项目里面,就像其他大大说的,一个共通的封装基本实现,其他继承的去特殊化。
0 请登录后投票
   发表时间:2008-11-11  
看到这个题目,看了很多回复.
这个怎样?

/** 指定条件获取一组记录 */
@SuppressWarnings("unchecked")
protected List getList(String hql, boolean isSql, Object[] params, Type[] types, int pageIndex, int pageSize, Class pojo, int sessionType)
{
long start=0;
if (null != params && params.length != types.length)
{
daoLogger(null, "params 和 types 长度不一致", pojo);
return null;
}
Session session = null;
try
{
session = getSession(sessionType);
start=System.currentTimeMillis();
Query query = null;
if (isSql)
query = session.createSQLQuery(hql);
else
query = session.createQuery(hql);

if (null != params)
query.setParameters(params, types);
if (0 < pageIndex)
{
query.setFirstResult((pageIndex - 1) * pageSize);
query.setMaxResults(pageSize);
}
if (WapConfig.IS_DEBUG)
Logger.debug("数据库监控", "指定条件读取一组数据@对象类型:" + pojo.getClass().getName() + ". SQL:" + query.getQueryString());
return query.list();
}
catch (Exception ex)
{

ex.printStackTrace();
daoLogger(ex, "获取列表失败@getList", pojo);
return null;
}
finally
{
if (null != session && session.isOpen())
session.close();
System.out.println("执行时间 : "+(System.currentTimeMillis()-start));
}
}
0 请登录后投票
   发表时间:2008-11-11  
不管你怎样查, 不管你几个DAO. 继承1个DAO,使用this. getList(String hql, boolean isSql, Object[] params, Type[] types, int pageIndex, int pageSize, Class pojo, int sessionType)
我想,省你不少代码吧...
0 请登录后投票
   发表时间:2008-11-11   最后修改:2008-11-11
以上结论,所以不大喜欢用spring+hibernate这种开发模式!ejb3.0也正解决了这一问题,只需要一个DAO就可以了.为了维护方便,多几个DAO也无所谓.
0 请登录后投票
   发表时间:2008-11-11  
showcup 写道
看怎么用吧,像你业务中基本上就是curd那么是你这样做,肯定无妨!

占楼主个地方 。。。  兄弟   你咋搞个和我一样的头像。。。 
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics