论坛首页 Java企业应用论坛

关于DAO层的疑惑!!!平地一声雷

浏览 24786 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (14) :: 隐藏帖 (6)
作者 正文
   发表时间:2011-08-03  
我的采用的是通用DAO
0 请登录后投票
   发表时间:2011-08-03  
简单的CURD,抽象出一个顶层BaseDao借口,然后每个ModelDao接口继承自抽象接口,至于说每个dao都要引用sessionFactory大可不必,写一个超类引用sessionFactory就可以了,然后所有ModelDaoImpl都继承自这个超类,这么说LZ明白了么?
0 请登录后投票
   发表时间:2011-08-03  

我们现在的项目是s2 spring ibatis
简单的CRUD 直接action -> sqlmap
复杂的业务 action -> service ->sqlmap 主要是为了事务

以前s2sh项目 烦的要死 action -> service ->servieImpl -> dao -> daoImpl 改一个东西烦的要死,

越来越不喜欢hibernate
0 请登录后投票
   发表时间:2011-08-03  
如果通用DAO层接受Service层传来的HQL的话
还有这样的事?
0 请登录后投票
   发表时间: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层这两个整体.

不知道我这种想法是否合理?
0 请登录后投票
   发表时间:2011-08-03  
DAO如果你不更换,那么可有可无,与业务强相关,也不进行扩展,就不用动

但是如果你是为了产品化,多个地方扩展,DAO层还是挺有意义的,至少减少开发量
0 请登录后投票
   发表时间: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...
0 请登录后投票
   发表时间:2011-08-03  
Caedmon 写道
简单的CURD,抽象出一个顶层BaseDao借口,然后每个ModelDao接口继承自抽象接口,至于说每个dao都要引用sessionFactory大可不必,写一个超类引用sessionFactory就可以了,然后所有ModelDaoImpl都继承自这个超类,这么说LZ明白了么?


这个我也想过,我关注的是xml中配置的问题,这么写的话,每个类还是要单独配置一个xxxdao是不是?
如果不是,请你详细说明下你的办法!
0 请登录后投票
   发表时间:2011-08-03  
BaseDao是个接口(使用泛型)对应一个或多个BaseDaoImpl,比如当前使用数据库是MySql,那么实现就是MysqlBaseDaoImpl,service与此就可以隔开,当你更换数据库时只需要更换BaseDaoImpl,无需更换任何service代码,这也是我们公司现在的做法。
0 请登录后投票
   发表时间:2011-08-03  
feiyang404 写道
CRUD中最麻烦的是查询。每个对象都有一大堆查询方法,千奇百怪五花八门。所以现在的Dao膨胀得很厉害。加上很多人不能理清楚Service和Dao的关系,Action里都是HQL
所以如何在隔绝具体实现的情况下零花灵活查询才是问题所在。希望JPA2能够给出一些更好的解决办法。虽然Hibernate和Jpa中也可以使用命名查询。但是很多时候查询参数是不定的。比如查一个对象的创建时间在某个起始时间到某个结束时间之间。这是一个很常见的情况。但是这其实是三个查询,一个是只有开始时间、一个只有结束时间还有就是两个都有。命名查询就需要3个。推论到所有的对象上,命名查询会疯长的。

我只能说你们管理有问题.
0 请登录后投票
论坛首页 Java企业应用版

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