`

讨论: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]);
  }
  这种方式接口签名也是稳定的,不过接口也是不清晰。 

   不知道大家在实践中还有没有其他好的方法,欢迎抛玉!!
分享到:
评论
21 楼 抛出异常的爱 2007-03-11  
gaopu202 写道
可以设计为一个示例查询不,它可以自动处理空的参数,但是要查询一个时间段内的数据还需要一个高手来解决

不用什么高手
以前用map传ibites也是有时间段的....
我也能写但没有意义
20 楼 jameswei 2007-03-10  
个人感觉用Map封装查询参数不错.

以前在项目上用过类似lz的solution 1:
将一些基本的查询参数放入查询参数类中,
如果有其它特定参数,可extends之.
19 楼 gaopu202 2007-03-04  
可以设计为一个示例查询不,它可以自动处理空的参数,但是要查询一个时间段内的数据还需要一个高手来解决
18 楼 retreat 2007-03-02  
我通常设计成如下的结构!

有2个关键

1:把查询条件封装起来
2:保持接口的健壮,也就是说保证业务接口关注方向

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(){.......})




17 楼 lyp2002924 2007-03-01  
JDK5.0中提供的不定数入参,是什么概念啊?
16 楼 chenxu 2007-03-01  
抛出异常的爱 写道
刑天战士 写道
用Map作参数才是王道!用对象的话太死板

?不见得
用来查询用pojo 也可以办到
或继承后加几个参数吧。。。。
    不见得,Map 作参数虽然灵活了,稳定了。

     但是其缺点同样显而易见:方法本身的成功运行
完全依赖于Map 中被放入的东西,当Map中被意外的放入的
不该放入的参数或者缺少了一个参数,会出现令人讨厌的难以
查找的异常。

     Map只是适合于查询条件本身就是灵活的,不确定的情况。
当查询接口本身就是确定的情况下应该使用对象参数查询,否则
很容易造成Map被滥用的情况
    
15 楼 抛出异常的爱 2007-01-16  
刑天战士 写道
用Map作参数才是王道!用对象的话太死板

?不见得
用来查询用pojo 也可以办到
或继承后加几个参数吧。。。。
14 楼 letle 2007-01-16  
可以用一个基类的pojo做参数
13 楼 lovevirus 2006-11-05  
我一直用对象来传递的,一般都是判断其属性是否为空或者大于零,成立我就根据这个条件来查询,这样对一般的查询都可以用一次做完.至于一些类似报表的查询,一个查询一个方法,呵呵
12 楼 stamen 2006-11-03  
marshal402 写道
直接queryOrder(String hql) ,在接口之外抽象形成hql语句生成器,这个生成器可以接受参数对象或者Map,但是参数命名遵循一定规范,生成查询语句。

   这种方式不太好吧,接口不够清晰,而且需要其他类的配合,不够内聚,我觉得hql倒是不一定要作为入参,但查询条件最好要作为入参。
11 楼 kimfly 2006-11-03  
List query(String sql,Map conditions); 方法不错,接口比较稳定。
10 楼 刑天战士 2006-11-03  
用Map作参数才是王道!用对象的话太死板
8 楼 deafwolf 2006-11-03  
用iBatis,在bean和dao一对一的情况下,直接用bean做参数,statement用动态的,这样就不用考虑参数的问题。
如果是多参数跨表查询,我认为还是用Map好一点
也可以自定义一个参数对象,稳定的部分用bean,不稳定的部分用Map
7 楼 fly_ever 2006-11-03  
查询的判断条件,结果排序等其他的要求,按上面那些方法就不能实现了。
6 楼 cayenne 2006-11-03  
Map做参数传递在Spring的DAO包中用得很多
5 楼 pedestrian_I 2006-11-03  
利用hibernate的QBE查询,传入一个对象为参数。只是不能查这个对象的id字段,既是数据库中的主键。
marshal402的sql生成器方式不错,只是如何抽象设计好,值得讨论。
4 楼 marshal402 2006-11-03  
这样这个接口的职责也会更清晰。
3 楼 marshal402 2006-11-03  
直接queryOrder(String hql) ,在接口之外抽象形成hql语句生成器,这个生成器可以接受参数对象或者Map,但是参数命名遵循一定规范,生成查询语句。
2 楼 leyen 2006-11-03  
List query(String sql,Map conditions);
这样设计如何?

相关推荐

    NHibernate in Action by Christian Bauer

    紧接着我们将开始探索NHibernate的主要功能,包括查询,事务处理,用户定制的接口。我们同时展示了基本设置和高级设置,让你可以通过日志更深入的了解NHibernate背后是如何工作的。 第三章以一定的速度告诉你...

    Spring面试题

    下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。 BeanFactory 支持两个对象模型。 □ 单态 模型提供了具有特定名称的对象的...

    二十三种设计模式【PDF版】

    有经验的面向对象设计者的确能做出良好的设计,而新手则面对众多选择无从下手,总是求助于以前使用过的非面向对象 技术。新手需要花费较长时间领会良好的面向对象设计是怎么回事。有经验的设计者显然知道一些新手所...

    iBATIS实战

    书中既详实地介绍了iBATIS的设计理念和基础知识,也讨论了动态SQL、高速缓存、DAD框架等高级主题,还讲解了iBATIS在实际开发中的应用。书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的...

    java设计模式CatalogDAOFactory是典型的工厂方法

    我们以Jive的ForumFactory为例,这个例子在前面的Singleton模式中我们讨论过,现在再讨论其工厂模式: public abstract class ForumFactory {  private static Object initLock = new Object();  private static ...

    通用管理框架正式版1.1源码

    编译已有代码,建立测试服务器虚拟目录,上传编译文件,初始化角色信息,整理开会讨论的个性模块变动和需求 编写获取页面标题函数,编写页面模块导航函数 弹出消息框代码编写 设计发送/接收消息模块的数据结构 ...

    +Flex+集成到+Java+EE+应用程序的最佳实践(完整源代码)

    Flex Builder 提供了一个可视化的编辑器,通过简单的拖拽,一个毫无经验的开发人员也能够设计出漂亮的布局。如果熟悉一点 XML 的知识,编辑 MXML 也并非难事。我们设计的 Employee Management 系统界面的最终效果...

    将 Flex 集成到 Java EE 应用程序的最佳实践(完整源代码)

    Flex Builder 提供了一个可视化的编辑器,通过简单的拖拽,一个毫无经验的开发人员也能够设计出漂亮的布局。如果熟悉一点 XML 的知识,编辑 MXML 也并非难事。我们设计的 Employee Management 系统界面的最终效果...

    SQL Server 2000开发指南(PDG)

    深入讨论使用Transact-SQL创建和操仳数据库对象,使用主要的编程接口(如ADO、DAO、OBDC及RDO等)来访问数据库,编写存储过程以及扩展的存储过程,使用ASP和XML开发集成的跨平台的WEB应用,对多系统进行数据复制,...

    java三大框架

    Inversion of Control的使用(在下面讨论)帮助完成了这种简化。 通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯。 Spring被设计为让使用它创建的应用尽可能少的依赖于...

Global site tag (gtag.js) - Google Analytics