读书人

议论:Dao查询接口设计经验

发布时间: 2012-11-20 09:55:43 作者: rapoo

讨论:Dao查询接口设计经验
接受若干查询条件的DAO查询方法接口在实际应用中,大家不知道是如何设计,下面是我所了解的4种定义方法:

1)为查询参数定义对象,如:
queryOrder(OrderQueryParam oqp)
OrderQueryParam为每一个查询条件项定义一个属性如:
Date startTime
Date endTime
int orderNo
int deptId
这种方式的优点是直观,接口清晰且稳定,但是需要定义大量的查询参数对象,比较麻烦。

2)用一个Map封装所有查询条件,如:
queryOrder(Map filterMap)
每一个查询条件项对应filterMap中一个元素
key value
----------------
startTime 20060101
endTime 20061201
deptId 1002
这种方式的接口签名也是稳定的,其他的优点和缺点正好和1)点相反

3)每一个条件项对应一个入参,如:
queryOrder(Date startTime,Date endTime,int orderNo,int deptId)
这种方式的接口签名不稳定,假如要加一个userId的条件,接口就得改了,但是接口也是比较清晰的。

4)使用JDK5.0中提供的不定数入参,如:
queryOrder(String hql ,Object... args)
在该中方法中:(需要注意args的顺序和hql中变量的顺序一致),组装Hql的核心代码如下:
Query query = getSession().createQuery(hql);
for (int i = 0; i < args.length; i++) {
query.setParameter(i, args[i]);
}
这种方式接口签名也是稳定的,不过接口也是不清晰。

不知道大家在实践中还有没有其他好的方法,欢迎抛玉!!
public class ObjectQueryHandleFactory { public ObjectQueryHandler openQuery() { ... };}

public class ObjectQueryFilterFactory {    public ObjectQueryFilter openFilter() { ... }; }


public class ObjectQueryHandler{}

public class ObjectQueryFilter{}


public class PersonQueryHandler extends ObjectQueryHandler{}


public class PersonQueryFilter extends ObjectQueryFilter{}


public class StreatQueryHandler extends ObjectQueryHandler{}


public class StreatQueryFilter extends ObjectQueryFilter{}



Dao设计

ObjectDaoGet(ObjectQueryHandler oqh, ObjectQueryFilter oqf) {};


这样把Query数据封装在ObjectQueryHandler这个模块组里,把Query逻辑封装在ObjectQueryFilter模块组里.处理起来非常灵活,还有一个非常吸引人的特性就是可以把工作丢给别人!由于你提供的只是封装,具体实现有每个开发人员自己掌握,自己的工作量少了很多,别人也不会太介意.同时也可以消除统一接口上引起的效率和业务接口被滥用的问题.

比如
public class dynaProxyHandleBuffer()



来加强一下我某一类的结构,而在只需要通过一项申明式的字段来标示.

ObjectQueryHandler.setPropertys(new ObjectrProperty(){.......})




19 楼 gaopu202 2007-03-04 可以设计为一个示例查询不,它可以自动处理空的参数,但是要查询一个时间段内的数据还需要一个高手来解决 20 楼 jameswei 2007-03-10 个人感觉用Map封装查询参数不错.

以前在项目上用过类似lz的solution 1:
将一些基本的查询参数放入查询参数类中,
如果有其它特定参数,可extends之. 21 楼 抛出异常的爱 2007-03-11 gaopu202 写道可以设计为一个示例查询不,它可以自动处理空的参数,但是要查询一个时间段内的数据还需要一个高手来解决
不用什么高手
以前用map传ibites也是有时间段的....
我也能写但没有意义

读书人网 >软件架构设计

热点推荐