论坛首页 Java企业应用论坛

关于DAO API的取舍

浏览 28064 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-08-27  
不过Logic里面我一般连SELECT都不写,都封装在DAO里面了,DAO是比较Heavy了一些,Logic里面只要告诉DAO参数就可以取到相应的数据,完全隔离开来,我觉得思路会清楚一些,特别是逻辑非常复杂的时候,这样写Unit Test也相对要方便地多

我写的那个Filter非常像Criteria,只是我稍微简化了一些,而且没有做到那么完善,仅仅现在还算测试阶段,需要完善。而且这个东东也只给DAO内部用,外面基本上不怎么给用,当然在外面用也是可以的,比较快速,不用写得太繁琐。

有时候觉得MS有些程序构架不错,我经常参照他们的Duwamish之类的写FW
0 请登录后投票
   发表时间:2004-08-27  
不是利用Criteria,而是借鉴它组装HQL。如果利用了Criterial,还是无法移植。
0 请登录后投票
   发表时间:2004-08-27  
所以我写的是接口,有相应的impl对应,不会出现移植性错误:)
0 请登录后投票
   发表时间:2004-08-27  
偶是用Spring的
	protected List findNamedQueryStringParams(final String queryName,
			final String paramName, final Object paramValue,
			final String param2Name, final Object param2Value,
			final String param3Name, final Object param3Value,
			final String param4Name, final Object param4Value,
			final boolean cacheable, final int maxResultCount); {
		return getHibernateTemplate();.executeFind(new HibernateCallback(); {
			public Object doInHibernate(Session session);
					throws HibernateException {
				Query queryObject = session.getNamedQuery(queryName);;
				if (cacheable);
					queryObject.setCacheable(true);;
				SessionFactoryUtils.applyTransactionTimeout(queryObject,
						getSessionFactory(););;
				if (paramName != null);
					queryObject.setParameter(paramName, paramValue);;
				if (param2Name != null);
					queryObject.setParameter(param2Name, param2Value);;
				if (param3Name != null);
					queryObject.setParameter(param3Name, param3Value);;
				if (param4Name != null);
					queryObject.setParameter(param4Name, param4Value);;
				if (maxResultCount != -1);
					queryObject.setMaxResults(maxResultCount);;
				return queryObject.list();;
			}
		});;
	}

以此为基础,有几个不同参数findNamedQueryString方法即可,或者用一个String数组,一个Object数组作为参数也可。同样Iterator也这样做,这样可对付绝大多数的查询了。
DAO继承了这些方法,如果要添加其他的查询法,只要这样写
	public List findAllGlobalInfoEntities(); {
		return findNamedQuery("bba96.infoEntity_findAllGlobalInfoEntities");;
	}

然后在hbm.xml文件中写HSQL即可。例如
    <query name="bba96.infoEntity_findAllGlobalInfoEntities"><![CDATA[
        from Country country
    ]]></query>

觉得这样如何?
0 请登录后投票
   发表时间:2004-09-22  
参数太长,使用者会发疯的!
0 请登录后投票
   发表时间:2004-09-22  
注意看,我说是以此为基础。
若不清楚,请参见Java中"方法重载"这一部分

----------------------
后来发现都是多此一举,Spring新版本的Template已经添加了一些常用的方法了.
0 请登录后投票
   发表时间:2004-09-24  
我问各位一个关于DAO问题!
class Teacher{
Integer Id;
String name;
Set students;
}
class Student{
Integer Id;
String name;
}
要得到一个老师的全部学生
方法A,是有先找到这个老师,再取从这个老师取学生.添加student时,用update.但是在hibernate中, 取出老师后session已经关闭,学生取不出来了.
TeacherDAOA{
public Teacher findById(Integer teacherid);
public void Update(Teacher);
}
方法B,直接出老师的学生,添加一个老师的学生时也要用DAO.
TeacherDAOB{
public List(Set) getStudents(Integet teacherId);
public void addStudent(Integer teacherid,Integer studentId);
}
以上哪种方法使用是正确的.还是全错误了.还是DAO 可设计成各式各样的,只要能与实现独立就可以了?
0 请登录后投票
   发表时间:2004-09-26  
http://www.ociweb.com/jnb/jnbNov2003.html把DAO这种体力活很好地避免了。

这篇文章是从曹晓钢的BLOG那看的,后来得知是从冰云的BLOG里看来的。
0 请登录后投票
   发表时间:2004-09-27  
试试ParadiseSDK吧:)
https://paradisesdk.dev.java.net
0 请登录后投票
   发表时间:2004-09-27  
引用
http://www.ociweb.com/jnb/jnbNov2003.html把DAO这种体力活很好地避免了。

这篇文章是从曹晓钢的BLOG那看的,后来得知是从冰云的BLOG里看来的


的确提供了一种比较好的DAO封装方式,扩展性也很强。我只是觉得对于只知道前台formbean的情况下,需要做复杂查询,而这些复杂查询本身是动态的情况下,还是避免不了DAO的过于庞大。即使可以配置Criteria,而Criteria也是无法脱离session的,要合理运用Criteria的话,就需要对传入到DAO的参数做一下mapping。

楼上两位提供了DAO的比较好的封装方法,不过我还是觉得在DAO中加入过多的查询函数,并对每个类都实现不同的DAO函数,不是一个好的方法。
0 请登录后投票
论坛首页 Java企业应用版

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