锁定老帖子 主题:只需要一个DAO,是个好主意吗?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (5) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-11
我能想到的有下面几点缺陷
1:DAO 理论上只负责数据访问逻辑而并不封装service,所以理论上说封装成一个Dao是可行的,但是实际操作过程中,您可能要面对下面的几个问题 a) 修改/删除/添加接口里面的方法后,所有的service都受影响。业界术语好像叫什么高耦合不可控。 b) 接口缺乏物理上的分离,类的职责界限不明确 c) 函数命名困难 d) 线程控制 似乎上面的问题是您最直接要面对的问题 |
|
返回顶楼 | |
发表时间: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层。 |
|
返回顶楼 | |
发表时间:2008-11-11
可以考虑用泛型减化成一个基础的dao,如果特殊需求再单独写以便区分
|
|
返回顶楼 | |
发表时间:2008-11-11
我已经丢弃DAO了,因为我发现如果使用DAO,会产生很多代码(虽然可以自动生成),而且用不好Hibernate,会很影响效率
|
|
返回顶楼 | |
发表时间:2008-11-11
ywlqi 写道 我现在就是用一个dao,sql写在service层里当作参数传递给dao
我对此的解释是service是业务逻辑层,sql也是根据业务决定的,所以sql放在service层是理所当然的 到目前为止这种模式用的很爽 同意楼上,我现在也是用一个dao |
|
返回顶楼 | |
发表时间:2008-11-11
我觉得不管是一个DAO也好,是多个DAO也好,最重要的是针对你这个项目,当然,在大部分项目里面,就像其他大大说的,一个共通的封装基本实现,其他继承的去特殊化。
|
|
返回顶楼 | |
发表时间: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)); } } |
|
返回顶楼 | |
发表时间:2008-11-11
不管你怎样查, 不管你几个DAO. 继承1个DAO,使用this. getList(String hql, boolean isSql, Object[] params, Type[] types, int pageIndex, int pageSize, Class pojo, int sessionType)
我想,省你不少代码吧... |
|
返回顶楼 | |
发表时间:2008-11-11
最后修改:2008-11-11
以上结论,所以不大喜欢用spring+hibernate这种开发模式!ejb3.0也正解决了这一问题,只需要一个DAO就可以了.为了维护方便,多几个DAO也无所谓.
|
|
返回顶楼 | |
发表时间:2008-11-11
showcup 写道 看怎么用吧,像你业务中基本上就是curd那么是你这样做,肯定无妨!
占楼主个地方 。。。 兄弟 你咋搞个和我一样的头像。。。 |
|
返回顶楼 | |