`

讨论: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);
这样设计如何?

相关推荐

    new_dao

    - **接口定义**:DAO接口通常包含了一系列用于执行数据库操作的方法,如添加、删除、更新和查询数据。 - **实现类**:DAO接口的实现类提供了具体的数据访问逻辑,如SQL语句的执行,可能使用JDBC或其他ORM框架(如...

    Don’t repeat the DAO!

    但根据标题,我们可以推测博主林诗权可能在文章中讨论了在实际项目中如何避免DAO层的冗余代码,分享了最佳实践和经验,可能包括如何通过抽象、继承、工厂模式或使用ORM(对象关系映射)框架来优化DAO的设计。...

    dao设计模式视频教程

    3. 业务接口及实现:业务层通过调用DAO接口来进行数据操作,不直接与数据库打交道,提高了代码的解耦度。 4. 客户端:应用程序,通过业务接口来调用服务,间接地使用DAO对象进行数据存取。 本教程可能涵盖以下内容...

    java 基于泛型与反射的通用 DAO

    DAO模式是一种设计模式,旨在提供一个统一的接口,用于数据库的访问,隐藏底层的数据访问细节。在Java中,DAO通常负责与数据库的交互,包括CRUD(创建、读取、更新、删除)操作。 最后,“IBaseDao.java”可能是`...

    基于MVC的论坛(用到struts+dao设计模式)

    1. **DAO接口**:定义了对数据对象的基本操作,如添加、删除、更新和查询。 2. **DAO实现类**:实现DAO接口,提供具体的数据访问实现,如使用JDBC或者ORM框架(如Hibernate)与数据库交互。 3. **事务管理**:论坛...

    DAO-2.3.4.726

    5. **接口驱动编程**:iBATIS鼓励使用接口驱动的编程模型,开发者定义DAO接口,然后在XML配置文件中指定对应的SQL语句,这样可以保持业务逻辑与数据访问的分离。 6. **参数映射**:在调用DAO方法时,可以传递参数,...

    数据库dao操作jdbc

    8. **DAO接口和实现**:定义一个DAO接口,比如`UserDao`,包含各种数据库操作方法。然后实现这个接口,具体实现JDBC代码。 9. **工厂模式**:使用工厂类(如`DataSourceFactory`)来创建和管理数据库连接,提供线程...

    《J2EE核心模式》(DAO模式)

    在讨论DAO模式的同时,我们还提到了抽象工厂模式。这是一种创建型设计模式,用于提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在数据访问场景中,抽象工厂模式可能被用来创建不同数据库...

    java好用的dao

    在传统的Java开发中,我们需要为每个数据库表创建一个对应的DAO接口以及其实现类,然后在这些类中编写SQL语句或使用ORM框架来操作数据。而AutoDAO通过简单的配置和注解,就能自动生成这些类,使得开发人员可以专注于...

    自动生成DAO源代码

    在软件开发过程中,数据访问对象(DAO)模式是一种常见的设计模式,用于封装对数据库的操作,以提高代码的可重用性和可维护性。本主题主要介绍如何利用Eclipse的Java Text Templates (JET)功能自动生成DAO源代码,...

    hibernate4 通用dao,service

    3. Service层的设计:讨论如何在Service层中封装业务逻辑,调用DAO方法,可能还包括异常的捕获和处理,以及事务的控制。 4. 泛型的应用:可能使用Java泛型来提高DAO和Service的复用性,使得一个DAO或Service类可以...

    StuDAO.rar_dao

    4. 模式优缺点:讨论DAO模式带来的好处,如解耦、提高可测试性,以及可能存在的问题,如过度封装可能导致的效率问题。 5. 框架集成:介绍如何将DAO模式与Spring等框架结合,利用框架的事务管理、AOP等功能进一步优化...

    5-互评-OO之接口-DAO模式代码阅读及应用

    总结来说,"5-互评-OO之接口-DAO模式代码阅读及应用"这个主题涵盖了Java开发中的关键知识点,包括接口的概念及其在实现模块间契约中的作用,以及DAO模式在数据访问层的设计和实现。理解并熟练应用这些知识对于提升...

    分了dao service的ssm整合还附带分页功能

    在SSM整合中,MyBatis作为数据访问组件,与Spring配合,通过DAO接口进行数据库操作。 接下来,我们讨论DAO和Service的分离: 在Java Web开发中,DAO层主要负责与数据库的交互,而Service层则封装了业务逻辑。DAO层...

    用java的面向对象语言来操作关系型数据库 dao层.zip

    4. **DAO接口与实现**:定义一个DAO接口,列出所有可能的数据库操作方法,如`get`, `save`, `update`, `delete`。然后创建该接口的实现类,具体实现这些方法,内部使用JDBC进行数据库交互。接口使得我们可以轻松替换...

    商业编程-源码-魔法单词记忆——DAO访问ACCESS数据库.zip

    - 设计DAO接口,包含增删查改等基本数据库操作方法。 - 实现DAO接口,使用JDBC API(如Statement或PreparedStatement)来执行SQL语句。 - 编写业务逻辑层,调用DAO接口完成实际的数据操作。 4. 数据库操作: 在...

    Factory(DAO).rar_Factory DAO_dao_dao facto_factory

    DAO类通常包含对数据库的操作,如查询、插入、更新和删除数据,而这些操作的实现细节对调用者是透明的。通过使用DAO,我们可以将业务逻辑与数据访问逻辑解耦,使得代码更具有可测试性和可维护性。 Factory DAO模式...

    Java练习项目: web,service,dao的无框架练习项目

    DAO接口和实现类如`ProductDAO`、`OrderDAO`会提供对数据库的操作方法,以实现对商品信息、用户信息、订单数据的存储和读取。 4. **数据库设计**: 在这个项目中,可能涉及到的数据库表有`Product`(产品)、`User...

    JSP+DAO和MVC+DAO(基于MySQL数据库分页)-v笔记

    在分页场景下,DAO会包含获取指定范围数据的接口,例如`getRecordsByPage(int pageNum, int pageSize)`。 **MVC+DAO分页** MVC模式是一种设计模式,它将应用分为模型(Model)、视图(View)和控制器(Controller...

    spring 对dao 的操作

    1. **定义DAO接口**:首先定义一个DAO接口,声明需要的数据库操作方法,比如`List&lt;User&gt; findAllUsers();`。 2. **实现DAO接口**:接着,创建DAO接口的实现类,使用Spring提供的模板类或ORM框架来实现这些方法。 3...

Global site tag (gtag.js) - Google Analytics