锁定老帖子 主题:service于dao的界限
精华帖 (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中组装有什么不同么?我觉得有耦合吧 |
|
返回顶楼 | |
发表时间: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。 |
|
返回顶楼 | |
发表时间:2006-09-18
DAO你那样写,Action用分页对象,传到service,service传值到dao
|
|
返回顶楼 | |