论坛首页 Java企业应用论坛

service于dao的界限

浏览 10347 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-07-31  
阿木欢 写道

这个searchCriteria其实是和我设计的一个hqlRendering类配合使用的,我用这个hqlRendering类把servicelayer组织的searchCriteria翻译成hql,这样很多dao的功能比如dynamic search就可以写成一个放在BasicDAO里面的通用方法,减少代码量。

不知道你说的hqlRendering代码如何?
我倒是觉得是一样的。我的BaseDao只有find(hql)这种类似的几个方法,我是在dao中组装hql的,确保baseDao不牵扯到任何具体的应用。
而在单个dao中组装的时候,就要根据具体的情况来进行动态组装了。我想你说的这个hqlRendering可能也是封装了几个需要动态组装的地方吧?因为动态组装肯定是要和具体应用相关系的,这样和直接在dao中组装有什么不同么?我觉得有耦合吧
0 请登录后投票
   发表时间:2005-08-01  
giginet 写道
阿木欢 写道

这个searchCriteria其实是和我设计的一个hqlRendering类配合使用的,我用这个hqlRendering类把servicelayer组织的searchCriteria翻译成hql,这样很多dao的功能比如dynamic search就可以写成一个放在BasicDAO里面的通用方法,减少代码量。

不知道你说的hqlRendering代码如何?
我倒是觉得是一样的。我的BaseDao只有find(hql)这种类似的几个方法,我是在dao中组装hql的,确保baseDao不牵扯到任何具体的应用。
而在单个dao中组装的时候,就要根据具体的情况来进行动态组装了。我想你说的这个hqlRendering可能也是封装了几个需要动态组装的地方吧?因为动态组装肯定是要和具体应用相关系的,这样和直接在dao中组装有什么不同么?我觉得有耦合吧


恩,其实应该查不多,你在BaseDAO里面组装HQL,我是利用反射在HQLRendering里面组装。我写一段简短的例子:
HQLRender:
public class HQLRender implements QLRender {
	public String render(SearchCriteria sc); {
		String hql = new String();;
		//render the inputted search criteria instance and
		//use reflection to dynamic construct the where clasue of hql
		return hql;
	}
}

SearchCriteria:
/**
 * @author jinyangzhou
 * This class is used to encapsulate the needed parameters while rendering the 
 * HQL and utilized to contain the parameters of pagination
 *  
 */
public class SearchCriteria {
	private Model[] queryModels;
	private List queryParam;
	private Map orderByMap;
	private int startRowNum;
	private int pageSize;
	private String[] queryModelAlias;
	private boolean excludeNone;
	private boolean excludeNull;
	private boolean excludeZero;
                private boolean excludeEmpty;
	private boolean dynamicSearch;	
	private boolean enableLikeQuery;                
}

BaseDAO:
public class BaseDAO {
	public Pager dynamicSearch(SearchCriteria sc); throws DAOSearchException{
		Pager pager = new Pager();;
		//1.get Hibernate Session
		//2.get Parsed HQL
		QLRender render = new HQLRender();;
		String hql = render.render(sc);;
		//3.create Hibernate Query instance
		//4.set pagination parameter
		//5.set query parameter(Iteration);
		//do query
		//set result to pager instance
		return pager;
	}
}

针对dynamic search的情况其实只需要一个BaseDAO的方法就可以做到了,这里我用到了反射,所以不会和具体的业务逻辑相关,举个简单的动态查询的例子:
UserModel:
public class UserModel implements SingleStringPKModel {
	private String id;
	private String firstName;
	private String lastName;
}

从前台的Struts Form convert成 UserModel 的instance为:
id=null;
firstName="test";
lastName=null;

searchCriteria:
enableLike = false;
excludeNull = true;
pageSize = 10;
queryModelAlias = {"a"}
那么通过反射很容易就的到:
select a.* from UserModel a where a.firstName = ?

paramList[0] = "test";

这样就可以在BaseDAO里面使用通过Render以后的SearchCriteria进行一些通用的查询。
当然,这里还有很多情况没有考虑,比如count hql的generation, 非等于(>,>=,<,<=)字段的查询,这些参数都可以在SearchCriteria里面采用某种形式的Mapping保存。
实际上我们项目的这个SearchCriteria和HQLRender的功能比较完善,再加上BaseDAO的接口设计,基本上解决了90%的DAO层代码,在LogicDAO extend BaseDAO 或者 composite 开发的模式下,dao层代码非常lank。
实现这个Render的时候有几个难点:
1.通过传入的Model动态生成hql where clause的时候,要考虑到对composite pk model的支持
2.需要分页支持的时候得count hql的generation
3.对多Model关联查询的支持(这也是alias类型是String[]的原因)
暂时记得这么多了。。呵呵,希望兄弟们补充补充。
当然这些封装是我在做hibernate2项目的时候做的东东,可能不适合hibernate3。
0 请登录后投票
   发表时间:2006-09-18  
DAO你那样写,Action用分页对象,传到service,service传值到dao
0 请登录后投票
论坛首页 Java企业应用版

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