`

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--企业应用开发详解》

分享到:
评论

相关推荐

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

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

    spring-dao-2.0.8.jar.zip

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

    MybatisDemo:DAO层简化与逆向工程

    其中的方法签名有如下要求: •方法名与对应的xml中的标签的id相同(Mybatsi称其为statement) •方法如果有返回值,需要同xml标签中的resultType/resultMap类型相同,如果没有则为void •方法如果有形参,需要同xml...

    积分java源码-JetLiveSource:JDBC代码生成器-JavaDAO模式的实现

    类,方法签名 1-1 过程中的参数映射 函数:为函数调用创建 Java 类,方法签名 1-1 函数中的参数映射 自动实现 - 无需提供类型的 XML 映射。 兼容数据库 Oracle 服务器,需要 Oracle MySQL,需要 MariaDB,需要 ...

    vostok-dao:NEAR简约DAO钱包

    沃斯托克岛附近一个简单的链上DAO,用于执行多重签名传输。 它是为人类和dapp分配资金而设计的。状态Alpha阶段,需要更多测试姓名是Vostok计划的首次太空飞行,也是历史上的首次人类太空飞行。 沃斯托克(Vostok)3...

    Spring.3.x企业应用开发实战(完整版).part2

    15.2.3 处理方法签名详细说明 15.2.4 使用HttpMessageConverter 15.2.5 处理模型数据 15.3 处理方法的数据绑定 15.3.1 数据绑定流程剖析 15.3.2 数据转换 15.3.3 数据格式化 15.3.4 数据校验 15.4 视图和视图解析器 ...

    Spring3.x企业应用开发实战(完整版) part1

    15.2.3 处理方法签名详细说明 15.2.4 使用HttpMessageConverter 15.2.5 处理模型数据 15.3 处理方法的数据绑定 15.3.1 数据绑定流程剖析 15.3.2 数据转换 15.3.3 数据格式化 15.3.4 数据校验 15.4 视图和视图解析器 ...

    governance:所有与Archer DAO治理相关的合同

    ARCH令牌符合ERC-20,带有附加组件,以允许进行脱链签名以进行批准和转让(请参阅 , 和 )。 合同不可升级,并且使用不可变逻辑。 不变逻辑包括用于修改总供应量和令牌元数据的配置。 供应更改必须通过...

    Snapshot是一种基于IPFS去中心化存储系统的投票工具。

    5. 空间可以使用自定义配色方案和域名进行品牌宣传 6. 具有MIT许可证的完全开源 Snapshot的工作原理是利用IPFS网络来创建和存储投票,使用私钥签名,签发后的消息可以选择上链或不上链,当链下可以对消息进行验证。...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    随着博客人数的增加, Blog 作为一种新的生活方式、新的工作方式、新的学习方式已经被越来越多的人所接受,并且在改变传统的网络和社会结构:网络信息不再是虚假不可验证的,交流和沟通更有明确的选择和方向性,单一...

    BD:区块链开发人员-每周一次

    蓝光区块链开发人员计划: 第一周,请参阅文件夹BD_W1 hash1:字符串的md5; hash2:字符串的错误签名; hash3:字符串的真实签名。 第2周,请参阅文件夹BD_W2 Naivecoin区块链实现Geth控制台上的穿越第3周见GILDA ...

    OPhone应用开发权威指南(黄晓庆)

    7.2.1 三种不同的数据源 278 7.2.2 MediaPlayer的状态 281 7.2.3 音乐播放器实例 284 7.2.4 播放视频 296 7.3 录制音频 299 7.3.1 MediaRecorder的状态图 299 7.3.2 录音器实例 301 7.4 MP3文件格式分析 306 7.4.1 ...

    Guns 技术文档 旗舰版v2.3.pdf

    3.5.2 复杂查询的分页 3.5.3 获取前端表格插件传值 3.6 数据范围 3.6.1 介绍 3.6.2 如何使用 3.6.3 原理 3.7 guns-rest模块的使用 3.7.1 关于jwt鉴权 3.7.2 关于传输数据的签名 3.7.3 guns-rest模块的运行流程 3.7.4...

    JavaEE企业级应用开发教程(Spring+SpringMVC+MyBatis)习题(2022).pdf

    18. Spring 与 MyBatis 的整合:Spring 与 MyBatis 框架的整合时,可以通过 Spring 的编程式事务管理,然后调用实例对象中的查询方法来执行 MyBatis 映射文件中的 SQL 语句。 19. Spring 的 JAR 包:Spring 开发所...

    关闭开机硬盘自检xp.zip

    下次启动zhi时竟然还继续扫描,每dao次开机都这样 这时就需要用修改注册表的办法 把扫描取消了 但是如果电脑没有问题 最好不要取消这个功能 因为如果非正常关机的话 硬盘中有些文件会遭到破坏 有时强制关机会造成...

    IsoBuster-v2.7 含有注册码

    ■ 支持提取DAO镜像,Duplicator 镜像。 ■ 支持提取ISO镜像,常规 ISO 镜像。 ■ 支持提取BIN镜像,CDR -Win 镜像。 ■ 支持提取IMG镜像,CloneCD 镜像。 ■ 支持提取CCD镜像,CloneCD (Track Description)。 ...

    WebIM_Ajax框架

    5.修改昵称/个性签名/性别; 6.修改密码; 7.修改好友备注; 8.群组成员备注; 9.删除群组成员; 10.设定/撤销群组管理员; 说明: 1.环境要求:服务器 .NET Framwork 3.5;客户端支持FF、Chrome和IE6+浏览器; 2....

    基于AJAX的WebIM(ASP.NET + JQuery + AJAX)

    服务器端采用 MC 设计模式,Controler 分为组包拆包模块(编码子模块、加密解密子模块、序列化/反序列化子模块)和主处理模块(包含:Manager、DAO);其中加密解密模块,由于 js 支持不好,预留暂不使用; 客户端...

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

    对这个简单的应用,省略了 DAO,直接在 Fa?ade 中通过 Spring 的 JdbcTemplate 操作数据库。最后,EmployeeMgmt 应用通过 Servlet 和 JSP 页面为用户提供前端界面: 图 2. EmployeeMgmt Web 界面 该界面为传统...

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

    对这个简单的应用,省略了 DAO,直接在 Façade 中通过 Spring 的 JdbcTemplate 操作数据库。最后,EmployeeMgmt 应用通过 Servlet 和 JSP 页面为用户提供前端界面: 图 2. EmployeeMgmt Web 界面 该界面为传统...

Global site tag (gtag.js) - Google Analytics