`
wzf7065
  • 浏览: 247450 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

java封装查询条件

 
阅读更多
原文来源:http://sunboyyyl.blog.163.com/blog/static/2247381201216111910902/  

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

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

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

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

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


     这种方法签名含义清晰,可读性强,内部的逻辑处理简单,但接口稳定性差。
      假如这个findOrder()方法需要添加一个userName的条件,有两种重构的方式:第一,调整方法的签名,新增一个String userName入参,这种重构被认为是不健康的重构,因为它违反软件设计中经典的“开-闭原则”,此外如果条件项个数很多,方法签名将显得过于拖沓;第 二,在DAO类中新增一个重载查询方法,如果查询条件项的组合数过多,DAO类的方法数目将直线上升,整个实体DAO类将显得臃肿笨重。

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

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

Java代码 
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并无多大的区别:

Java代码 
List  findOrder(String hql,Object... params) 


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

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


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


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

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

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

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

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

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

相关推荐

    java封装前端查询条件通用版

    Java 封装前端查询条件通用版 Java 封装前端查询条件通用版是 Java 语言中的一种通用解决方案,旨在帮助开发者快速构建高效的前端查询条件。该解决方案主要涉及到查询条件的封装、参数处理、分页机制等多个方面。 ...

    JAVA封装类练习题

    下面将详细探讨在"JAVA封装类练习题"中的相关知识点。 首先,我们要理解什么是封装。封装就是将数据和操作这些数据的方法绑定在一起,作为一个整体——即类。在Java中,我们通过关键字`private`、`public`、`...

    Elasticsearch的JAVA操作工具类,包括增删改查的封装

    使用`searchRequest()`方法创建搜索请求,设置查询条件,然后执行请求。 ```java import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import ...

    Java对List多个排序、查询条件的处理

    在Java编程中,对List进行多个排序和查询条件的处理是一项常见的任务,特别是在处理数据集合时。本篇文章将深入探讨如何使用Java实现这些操作,并基于给出的`GroupFilterSortUtils.java`文件,我们可以推断这是一个...

    java 封装完整的分页类

    本教程将详细介绍如何在Java中封装一个完整的分页类,以便在JSP页面中轻松实现分页功能。 首先,我们需要理解分页的基本概念。分页通常包括两个关键参数:当前页数(currentPage)和每页显示的记录数(pageSize)。...

    java-mongodb底层封装

    以下是关于"java-mongodb底层封装"这一主题的详细知识点: 1. **MongoDB基础知识**: - MongoDB是一个基于分布式文件存储的开源数据库系统,支持多种数据模型,如文档型、集合型和图形数据库。 - 文档数据库:...

    Java实现-封装.ppt

    面向对象的编程语言Java在设计时充分体现了封装性这一核心原则。封装是面向对象编程的三大特性之一,另外两个是继承和多态。封装的主要目的是提高代码的安全性和可维护性,通过隐藏对象内部的实现细节,只对外提供...

    Java Web条件查询实例含源码

    在Java Web开发中,条件查询是一项关键技能,它允许我们根据特定条件从数据库中检索数据。这个实例包含了一个使用MyEclipse开发的项目,数据库环境是SQL Server。下面将详细探讨Java Web条件查询的实现、相关技术和...

    java根据查询出来的结果导出excel表

    通过条件查询数据库list,根据list去导出多列的excel表格,亲测有效工具类和代码js controller都放在一起

    java客房查询管理系统

    这些库提供了丰富的组件,如按钮、文本框、表格等,使得用户可以方便地输入查询条件,查看结果。事件监听器则被用来响应用户的操作,如点击查询按钮时触发查询操作。 安全性也是系统设计的重要方面。开发者可能会...

    自定义查询对象组件封装例子

    2. **Java封装**: 封装是面向对象编程的基本原则,意味着隐藏实现细节并提供公共接口供外部调用。在这个例子中,`QueryObject`应该有相应的getter和setter方法,但不应暴露内部逻辑,如如何构建SQL语句。此外,...

    java连接数据事件封装

    本话题主要关注"Java连接数据事件封装",这通常涉及到如何优雅地处理数据库事务以及事件驱动编程在JDBC中的应用。 在JDBC中,事务管理是确保数据一致性、完整性和并发控制的关键部分。事务是一组数据库操作,这些...

    一种面向对象的Java Bean查询方法的实现

    - **`query(Class&lt;?&gt; clazz, ConditionHolder conditionHolder)`**:根据`conditionHolder`中封装的查询条件查询数据库,并返回符合查询条件的Java Bean对象列表。 - **`getTableName(Class&lt;?&gt; beanClass)`**:返回...

    java反射例子,封装了一个反射帮助类

    在标题和描述中提到的“java反射例子,封装了一个反射帮助类”,这表明我们有一个实用工具类,可以帮助简化使用反射的复杂过程。 首先,让我们理解Java反射的基本概念。当我们的程序运行时,我们可以通过Class类来...

    自定义查询对象组件封装

    "自定义查询对象组件封装"就是这样一个实践,它涉及创建一个专门的组件,用于构建和解析查询条件,以便在表示层(通常是Web应用的前端)和后台(如服务层或数据访问层)之间进行通信。 首先,我们要理解查询对象的...

    Java 机票查询系统

    5. 查询结果返回给服务层,再由控制器封装成响应对象,传递回前端。 6. JSP页面接收到数据后,渲染成用户可读的格式,展示查询结果。 总的来说,【Java 机票查询系统】是一个典型的B/S架构应用,结合了Java、JSP、...

    Java 身份证号查询

    Java的数学运算和条件判断语句可以实现这一验证过程。 8. **文件I/O操作**:如果身份证号信息存储在文件中,那么可能需要使用Java的`FileInputStream`和`BufferedReader`等类来读取文件内容,将身份证号导入程序...

    java 学生信息查询系统

    《Java学生信息查询系统详解》 Java学生信息查询系统是一种基于Java编程语言和MySQL数据库设计的应用程序,旨在方便地管理、操作和查询学生信息。在这个系统中,用户可以通过图形用户界面(GUI)进行直观的操作,...

    java 快速查询手册(pdf)

    **Java 快速查询手册概览** Java 快速查询手册是编程人员日常工作中不可或缺的参考资料,它旨在帮助开发者迅速解决遇到的问题,提高编程效率。手册通常包含Java语言的关键概念、语法、API使用方法以及常见问题的...

    Java网络编程socket通讯简单封装(使用多线程)_20170808_LK

    在这个主题中,“Java网络编程socket通讯简单封装(使用多线程)”着重讨论了如何在Java中使用Socket进行基本的网络通信,并通过多线程提升并发处理能力。 首先,Socket在Java中的实现主要依赖于`java.net.Socket`和`...

Global site tag (gtag.js) - Google Analytics