论坛首页 Java企业应用论坛

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

浏览 16850 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-11-02  
    接受若干查询条件的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]);
  }
  这种方式接口签名也是稳定的,不过接口也是不清晰。 

   不知道大家在实践中还有没有其他好的方法,欢迎抛玉!!
   发表时间:2006-11-02  
还有一种方式就是用数据来传条件入参,位置和hql中的?一致。
0 请登录后投票
   发表时间:2006-11-03  
List query(String sql,Map conditions);
这样设计如何?
0 请登录后投票
   发表时间:2006-11-03  
直接queryOrder(String hql) ,在接口之外抽象形成hql语句生成器,这个生成器可以接受参数对象或者Map,但是参数命名遵循一定规范,生成查询语句。
0 请登录后投票
   发表时间:2006-11-03  
这样这个接口的职责也会更清晰。
0 请登录后投票
   发表时间:2006-11-03  
利用hibernate的QBE查询,传入一个对象为参数。只是不能查这个对象的id字段,既是数据库中的主键。
marshal402的sql生成器方式不错,只是如何抽象设计好,值得讨论。
0 请登录后投票
   发表时间:2006-11-03  
Map做参数传递在Spring的DAO包中用得很多
0 请登录后投票
   发表时间:2006-11-03  
查询的判断条件,结果排序等其他的要求,按上面那些方法就不能实现了。
0 请登录后投票
   发表时间:2006-11-03  
用iBatis,在bean和dao一对一的情况下,直接用bean做参数,statement用动态的,这样就不用考虑参数的问题。
如果是多参数跨表查询,我认为还是用Map好一点
也可以自定义一个参数对象,稳定的部分用bean,不稳定的部分用Map
0 请登录后投票
   发表时间:2006-11-03  
应用Hibernate3的DetachedCriteria实现分页查询
0 请登录后投票
论坛首页 Java企业应用版

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