`

5种DAO查询方法的签名方式

阅读更多

      DAO类中查询方法的签名多种多样,大家都使用什么签名方法呢?拿出来讨论一下吧。   

      DAO层除了CRUD的数据操作外,另一个重要的操作就是根据查询条件执行数据查询,不同的ORM框架都允许用户动态绑定参数确定查询条件。查询条件项的数目往往是不固定的,如既可能要求以userName为条件查询 User,也可能要求以userName+status等组合条件查询User。条件项数目的不定性给查询接口方法的设计造成为一定的困难,实体DAO定义带参的查询方法时,一般有5种方式,下面分别对这些方法进行介绍。

方式1:每一个条件项参数对应一个入参 

    查询方法中为每一个查询条件项定义一个对应的入参,如:

List  findOrder(String hql,Date startTime,Date endTime,int deptId)

    这种方法签名含义清晰,可读性强,内部的逻辑处理简单,但接口稳定性差。 
    假如这个findOrder()方法需要添加一个userName的条件,有两种重构的方式:

          第一,调整方法的签名,新增一个String userName入参,这种重构被认为是不健康的重构,因为它违反软件设计中经典的“开-闭原则”,此外如果条件项个数很多,方法签名将显得过于拖沓;

          第二,在DAO类中新增一个重载查询方法,如果查询条件项的组合数过多,DAO类的方法数目将直线上升,整个实体DAO类将显得臃肿笨重。

方式2:使用数组传递条件项参数 

    通过数组的方式传递查询条件项参数,由于参数类型的不一致性,要求数组类型采用Object[]:

List  findOrder(String hql,Object[] params)

    这种方法接口可以应付查询条件项参数组合的多样性并保持接口的稳定性,开发者必须在方法内部从数组中获取参数再传递给查询引擎。缺点是方法的可读性不强,调用者往往需要通过查看接口对应的Javadoc才能正确使用。此外,在JDK 5.0以下的版本中,因为没有自动拆/解包的语法特性,调用前必须对基本类型的参数使用封装类封装,有时在方法内部还需要进行相反的过程,在使用上较为不便。不过由于Spring为支持的ORM框架都提供了类似的查询接口(如HibernateTemplate#find(String queryString, Object[] values)),所以DAO方法内部的处理相对还是比较简单的。

    方式3:使用JDK 5.0的不定参数 

   如果在JDK 5.0中,则可以采用不定参数进行方法签名,这种方式在逻辑上和方式2并无多大的区别:

List  findOrder(String hql,Object... params)



   方式4:将查询条件项参数封装成对象 

     为了提高方法1中方法签名简洁性,增强方法2、3中方法签名的可读性,方式4提出将查询条件项参数封装成一个对象的思路,查询方法使用查询条件对象传递查询条件:

List<Order> findOrder(String hql,OrderQueryParam param)

     OrderQueryParam查询条件对象封装了hql查询语句可能会用到的条件项参数,在查询方法内部,开发者必须判断查询条件对象的属性并正确绑定条件项参数。由于需要为条件项参数定义一个类,因此会造成类数目的膨胀,有时甚至一个实体DAO需要对应多个查询条件参数类。另外,当需要添加一个新的条件项参数时,条件封装类还需要进行相应调整。

  方式5:使用Map传递条件项参数 

    另一种被广泛使用的方法是采用Map传递条件项参数,键为参数名,值为参数值:

List<Order> findOrder(String hql,Map params)


     使用这种方式,接口方法签名可以在条件项发生变化的情况下保持稳定,同时通过键指定条件项参数名在一定程度上解决了接口的健壮性(当调用者指定错误参数名时容易得到错误报警)。但和方法2、3一样调用者必须通过接口 Javadoc才能明白不同条件项要以什么名称进行设置。

注:以上5个查询方法签名的总结摘自于《精通Spring 2.x--企业应用开发详解》

分享到:
评论

相关推荐

    mybatis开发dao之mapper代理方式

    本示例重点讨论的是MyBatis中的Mapper代理方式,这是一种方便快捷的DAO(Data Access Object)开发模式。在Mapper代理方式下,我们无需手动创建DAO实现类,只需定义接口,MyBatis会自动生成对应的动态代理实现。 ...

    DAO设计模式DAO设计模式

    - **DAO接口**:定义了数据访问的方法签名,通常包括增删改查等操作。 - **DAO具体实现类**:实现DAO接口,负责具体的数据库交互逻辑。 - **数据传递对象**(Data Transfer Object, DTO):用于封装从数据库中读取的...

    快速生成dao、service、controller等相关代码

    该插件支持MyBatis,意味着它可以自动生成对应于数据库表的DAO接口和实现类,包括方法签名和SQL映射文件。 2. Service层:Service层是业务逻辑的载体,它调用DAO层的方法来完成实际的数据操作。插件能够生成服务...

    java代码生成器 生成dao模式下的类代码

    3. 然后,生成DAO接口(Interface),定义各种CRUD操作的方法签名。 4. 最后,实现DAO接口,编写具体的数据访问逻辑,这部分通常会使用JDBC或者ORM框架如Hibernate、MyBatis来完成数据库交互。 在实际应用中,使用...

    留言管理范例 —— JSP + DAO实现

    - **设计DAO接口**:定义DAO接口,包括上述提到的方法,并为每个方法制定签名。 - **实现DAO接口**:编写具体的DAO实现类,使用JDBC或者ORM框架(如Hibernate、MyBatis)来执行SQL语句,实现接口中的方法。 - **...

    外文翻译计算机外文翻译Don't repeat the DAO!

    本文通过介绍一种基于Java 5泛型的新方法来实现类型安全的DAO,旨在减少代码重复并提高开发效率。 #### 重要概念与技术背景 1. **Java 5 泛型**:Java 5引入了泛型这一特性,它允许开发者在类、接口和方法中定义...

    数据库处理封装 GotDotNet.ApplicationBlocks.Data AdoHelper Dao 源码

    封装时,我们可以在Dao类中根据业务需求封装这些细节,提供更加直观的方法签名。 5. **最佳实践** 在封装AdoHelper时,考虑以下最佳实践: - 使用参数化查询,防止SQL注入。 - 使用事务管理,确保数据一致性。 ...

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

    在Java中,接口定义了一组方法的签名,但不提供具体实现。通过实现接口,一个类承诺遵循接口定义的行为。这样做的好处包括多态性、解耦和扩展性。例如,在"5-互评-OO之接口"的上下文中,可能讨论了如何使用接口来...

    泛型dao

    而泛型DAO则可以使用一个通用的DAO接口,通过传入不同的类型参数来处理多种实体类,例如`&lt;T&gt; T save(T entity)`这样的方法签名,这里的`&lt;T&gt;`就是泛型,表示这个方法可以接受任何类型的对象。 下面我们将以一个简单...

    JSP_javabean_DAO_面向接口编程_工程模式.rar

    在Java中,接口定义了一组方法签名,但不包含具体的实现。这样,我们可以在不同的类中实现相同的接口,形成多态性,从而提高代码的灵活性和可扩展性。在本项目中,面向接口编程可能体现在定义DAO接口,然后由具体的...

    javaSE-day11-day12--主要实现了购物系统的dao层和service层

    接口定义了一组方法签名,但不包含具体实现。通过实现接口,类可以强制执行某种行为规范,使得不同模块间的协作更加规范和灵活。在Java中,接口还可以用于多继承,一个类可以实现多个接口,增加了代码的复用性。 在...

    mybatis持久化dao生成工具

    模板通常会包含DAO接口的方法签名,如`selectById`、`insert`等,以及Service接口和实现类的基本结构。一旦配置完成,工具会解析这些信息,利用Freemarker生成对应的Java源代码。 生成的代码会包括: 1. DAO接口:...

    java-生成单表完全动态查询

    在Java开发中,数据库操作是不可或缺的一部分,而编写与之对应的实体类、DAO(Data Access Object)层以及各种查询方法通常是一项耗时的工作。"java-生成单表完全动态查询"这一技术就是为了简化这一过程,它能自动...

    开心超级签名系统源码下载 Java超级签名系统企业签名超级签名 apk分发系统源码.zip

    开心的java超级签名系统,别人发的我也不知道那个版本了,这个java版当是别人1W多买的,java的不会搞就没搭建了,所以你也别来问我怎么搭建和演示了,截图是源码里的模板图,源码里附带部署说明。有需要的自行下载。...

    java自动生成bean 根据数据库表及字段(.net 2.0版本)新添Dao层jdbc生成

    自动生成这些接口可以根据数据库表的字段自动创建对应的方法签名。例如,对于一个名为`User`的表,可能会有`getUserById`、`saveUser`等方法。 3. **DAO实现类的生成**: DAO接口的实现类是实际执行SQL语句的部分...

    使用freemarker生成controller service impl pojo dao mapper

    使用FreeMarker,我们可以创建一个模板,定义Controller类的基本结构,包括方法签名、注解等。模板变量可以用于动态生成不同的控制器方法,根据业务需求进行扩展。 4. **生成Service和Impl** Service层定义了业务...

    spring3 mvc 注解action dao service 实例教程

    3. **方法签名的高度灵活性**:方法参数可以包括各种类型的对象,如`HttpServletRequest`、`HttpServletResponse`等。 这些改进使得控制器的设计更加简洁,同时提高了可维护性和可扩展性。 ##### 3. `@...

    spring-dao-2.0.8.jar.zip

    安全,可以对其进行数字签名,只让能够识别数字签名的用户使用里面的东西。 加快下载速度; 压缩,使文件变小,与ZIP压缩机制完全相同。 包封装。能够让JAR包里面的文件依赖于统一版本的类文件。 可移植性,能够...

    java 代码生成器 能自动生成sql语句和dao

    2. DAO接口与实现类生成:基于生成的SQL语句,代码生成器会创建相应的DAO接口,包括方法签名和注解,以及对应的实现类,包含具体的数据访问逻辑。 3. Entity模型类:根据数据库表字段,代码生成器会生成Java Bean类...

    jdbc练习题2.doc

    该 DAO 需要提供五个方法:插入人员、修改人员、删除人员、查询所有人员和分页查询人员。 知识点 1:DAO 设计 在软件设计中,DAO(Data Access Object)是一种常用的设计模式,用于将数据访问逻辑与业务逻辑分离。...

Global site tag (gtag.js) - Google Analytics