锁定老帖子 主题:关于DAO层的疑惑!!!平地一声雷
精华帖 (0) :: 良好帖 (1) :: 新手帖 (14) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-03
我的采用的是通用DAO
|
|
返回顶楼 | |
发表时间:2011-08-03
简单的CURD,抽象出一个顶层BaseDao借口,然后每个ModelDao接口继承自抽象接口,至于说每个dao都要引用sessionFactory大可不必,写一个超类引用sessionFactory就可以了,然后所有ModelDaoImpl都继承自这个超类,这么说LZ明白了么?
|
|
返回顶楼 | |
发表时间:2011-08-03
我们现在的项目是s2 spring ibatis 简单的CRUD 直接action -> sqlmap 复杂的业务 action -> service ->sqlmap 主要是为了事务 以前s2sh项目 烦的要死 action -> service ->servieImpl -> dao -> daoImpl 改一个东西烦的要死, 越来越不喜欢hibernate |
|
返回顶楼 | |
发表时间:2011-08-03
如果通用DAO层接受Service层传来的HQL的话
还有这样的事? |
|
返回顶楼 | |
发表时间:2011-08-03
魔力猫咪 写道 我目前对Dao的设计考虑是这样的。
使用ORM框架,设计一个只有基本CRUD的Dao接口。 public interface BaseDao<T> { public void perser(T t); public void mager(T t); public void delete(T t); public T find(Object id); } 大概是这个样子。然后写一个实现,用来实现基本的CRUD操作。 针对每个对象的专有Dao接口,是在继承BaseDao的基础上完成的。例如: public interface ADao<T> extends BaseDao { public List<T> findAll(); public List<T> findByXXX(Map params); } 然后这个专有Dao的实现是组合了基本BaseDao实现的。对基本CRUD进行代理,并实现自己的专有方法。 public class ADaoImpl implements ADao { private BaseDao bDao; public void delete(Object t) { bDao.delete(t); } public Object find(Object id) { return bDao.find(id); } public void mager(Object t) { bDao.mager(t); } public void perser(Object t) { bDao.perser(t); } public List findAll() { ... } public List findByXXX(Map params) { ... } } 像你这种写法,我想过,xml文件中的配置会配很多xxxDao;然后每个dao引用sessionfactory,这样到不如写一个通用dao然后再service层传过来hql语句,毕竟写一个hql比写一个Dao类来的方便多了. 我考虑良久,觉得不能太钻牛角尖了,所以,不能说dao层只能提供数据持久化,而应该说dao和service层共同负责提供数据业务处理接口,而Action层才是真正的业务逻辑,需要换持久化框架的时候,改写dao和service层这两个整体. 不知道我这种想法是否合理? |
|
返回顶楼 | |
发表时间:2011-08-03
DAO如果你不更换,那么可有可无,与业务强相关,也不进行扩展,就不用动
但是如果你是为了产品化,多个地方扩展,DAO层还是挺有意义的,至少减少开发量 |
|
返回顶楼 | |
发表时间:2011-08-03
仅此而已 写道 您好, 你的想法我很赞同, 同时有个问题想咨询下,希望你能给我些建议。
1、关于dao层 不同的bean对应的dao实际上是单例的, 跟据你的想法做成通用的 我可不可以只声明一个dao做成单例的 供service层调用呢,这样可以吗? 如果可以,当然dao层存在属性时会存在资源共享的问题, 这个问题应该如何解决呢? 2、S2SH 中, 事务管理想通过xml的切面进行统一管理,而bean的声明和注入想通过annotation 方式, 但是annotation很难注入父类中的属性,虽然可以用变通的方式(子类中声明set方法并引用父类待注入的属性……),但是并不能起到简化代码的作用。实际开发采用什么方式好呢? xml还是annotation ? 1. 做成通用的dao,在xml文件中只需要配置一份dao,每个service都可以引用,但是要对dao类中的方法做事务隔离级别设置,现在一般配置是一线程一session,所以不会出现你说的资源共享的问题,如果没有对某个方法配置事务隔离级别,那么数据库其实是不会执行这个方法的,数据库就会出现假死,没有任何错误提示,我是专门试验过的,你也可以尝试下. 2. 我对annotation保持抵触态度,而且并不熟悉,如果model类里有很多annotation的话,连属性都不好找,格式太乱,还是钟爱xml,灵活性也好些.我们实际开发中基本不用annotation,而是在testCase中用一点点的java annotation... |
|
返回顶楼 | |
发表时间:2011-08-03
Caedmon 写道 简单的CURD,抽象出一个顶层BaseDao借口,然后每个ModelDao接口继承自抽象接口,至于说每个dao都要引用sessionFactory大可不必,写一个超类引用sessionFactory就可以了,然后所有ModelDaoImpl都继承自这个超类,这么说LZ明白了么?
这个我也想过,我关注的是xml中配置的问题,这么写的话,每个类还是要单独配置一个xxxdao是不是? 如果不是,请你详细说明下你的办法! |
|
返回顶楼 | |
发表时间:2011-08-03
BaseDao是个接口(使用泛型)对应一个或多个BaseDaoImpl,比如当前使用数据库是MySql,那么实现就是MysqlBaseDaoImpl,service与此就可以隔开,当你更换数据库时只需要更换BaseDaoImpl,无需更换任何service代码,这也是我们公司现在的做法。
|
|
返回顶楼 | |
发表时间:2011-08-03
feiyang404 写道 CRUD中最麻烦的是查询。每个对象都有一大堆查询方法,千奇百怪五花八门。所以现在的Dao膨胀得很厉害。加上很多人不能理清楚Service和Dao的关系,Action里都是HQL。
所以如何在隔绝具体实现的情况下零花灵活查询才是问题所在。希望JPA2能够给出一些更好的解决办法。虽然Hibernate和Jpa中也可以使用命名查询。但是很多时候查询参数是不定的。比如查一个对象的创建时间在某个起始时间到某个结束时间之间。这是一个很常见的情况。但是这其实是三个查询,一个是只有开始时间、一个只有结束时间还有就是两个都有。命名查询就需要3个。推论到所有的对象上,命名查询会疯长的。 我只能说你们管理有问题. |
|
返回顶楼 | |