5种DAO查询方法的签名方式,哪个更好?

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

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

[b]方式1:每一个条件项参数对应一个入参[/b]

    查询方法中为每一个查询条件项定义一个对应的入参,如:
List  findOrder(String hql,Date startTime,Date endTime,int deptId)


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

[b]方式2:使用数组传递条件项参数[/b]

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


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

[b]方式3:使用JDK 5.0的不定参数[/b]

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


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

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

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


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

[b]方式5:使用Map传递条件项参数[/b]

    另一种被广泛使用的方法是采用Map传递条件项参数,键为参数名,值为参数值:
List<Order> findOrder(String hql,Map params)

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

[color=red]注:以上5个查询方法签名的总结摘自于《精通Spring 2.x--企业应用开发详解》[/color]
MetaLife元宇宙星际社交网络:Web2.5到Web3的里程碑 ​ 继元宇宙Metaverse在2021年火爆之后,Web3这个词的热度在2022年也开始飙升起来!原因就在于人们意识到构建在Web2之上的元宇宙对人类来说可能是致命的,只有构建在Web3之上的元宇宙才可能是开放的、无国界的、属于全人类的。在这个开放性的元宇宙里人类的数字资产才能得到真正的保护并在全球、甚至在星际之间流通。而MetaLife.Social这样的Web3去中心化星际社交网络(Intergalactic Social Network)才能为元宇宙提供隐私保护的分布式社交图谱。而大多So.. 阅读详情

相关推荐

速读以太坊ETH的历史十大灾难

伴随以太坊的价格起落,以太坊的真实价值一直也颇受质疑。而在以太坊诞生的几年中,却也经历过几次滑铁卢,更甚至会影响到以太坊的命运...

Similarweb Traffic 1483

通用型Dao层简单化查询通用方法

与hibernate的Critical类似,是一种通用的Dao层简单化查询通用方法,是我在13年刚接触hibernate的,因为当时的业务性质,需要频繁的简单查询,但我还不知Critical,所以编写了这么一套通用查询方法,思想应该与Critical是一致的 首先是service层,这个通用的service使得可以直接从action层传递参数,查询出相应的对象或集合 package c

liuyuqin1991的专栏 3192

基于Android+Java的邻家书苑书城App源码设计详解

移动应用开发中,Android平台凭借其开放性与生态优势,成为众多开发者入门与实战的首选方向,而Java语言作为其经典底层支撑,至今仍是理解原生开发逻辑的基石。在构建书城类应用时,数据持久化与架构分层往往决定项目的可维护性与扩展性。SQLite作为Android内置的轻量级关系型数据库,以零配置、高性能的特性承载用户、书籍、购物车及订单等结构化数据;MVP架构则通过隔离视图与业务逻辑,让代码更清晰、更易测试。围绕“邻家书苑”这一开源示例,文章从用户注册登录、图书浏览、RecyclerView列表展示,到购物

weixin_30565327的博客 410

DAO层常用的查询方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34352449的博客 707

NVIDIA DGX Spark实战:如何在桌面上轻松运行200B参数大模型(附配置教程)

本文提供了NVIDIA DGX Spark在桌面端运行200B参数大模型的完整实战指南。详细介绍了从硬件初始化、系统配置、容器化环境搭建,到模型加载、量化、推理流水线编写及性能调优的全过程。重点阐述了如何利用其统一内存架构和TensorRT-LLM等工具进行高效本地推理,并探讨了通过双机互联扩展以应对超大规模模型的方法。

i3j4k5的博客 782

stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)

多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...

weixin_39611722的博客 2997

dao层数据库查询操作

ssh项目中数据库的分页查询

ibelieveyoucan的博客 7752

华为OD机试:使用Ascend C语言实现Matmul与LeakyReLU融合算子的全流程设计与优化解析

通过本文的详细解析,相信你已经对华为OD机试中基于Ascend C语言的Matmul+LeakyReLU融合算子的设计与实现有了深入的理解。我们不仅从理论上探讨了融合算子的核心优势,还通过实际的代码示例演示了如何一步步完成算子的实现与优化。融合算子在AI算子开发中的应用,尤其是在处理大规模矩阵计算的场景中,能够显著提升计算效率,优化内存占用,并减少数据传输的开销。通过合理的Tiling策略设计,我们还能够充分利用多核处理器的算力,进一步提升AI模型的训练与推理性能。

qq_38334677的博客 661

通用的DAO查询,常见方法集合

import java.io.*;import java.sql.SQLException;import java.util.ArrayList;import java.util.List; import org.hibernate.Hibernate;import org.hibernate.HibernateException;import org.hibernate.Query;impor...

java 486

Qt5.15.7编译报错问题汇总:python2安装环境导致的问题

导致编译生成的:RegExpJitTables.h文件大小为0。RegExpJitTables.h 能生成且大小不为0KB。可以看到,正确的python路径,执行编译路径后。再执行 configure XXX…尝试直接改,将其改为正确的路径。

MusicScore的博客 1439

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。

flypig has a dream! 6861

DAO常用方法(增删改查)

1.返回List&lt;对象&gt; Listpublic List searchAllData(){ String querySql = " select * from dt_tag_list order by order_number "; return jdbcTemplate.query(querySql, new Object[]{},new RowMapper&lt;T...

Mr long的博客 1万+

【数据集5】土地利用类型数量预测数据LUH2

简介土地利用类型数量预测数据LUH2

WW、forever的博客 4546

CRUD的相关问题

    最近做的网站主要就是CRUD操作,如果对每个实体都编写对应的DAO类,并且每个DAO类都写上CRUD方法,显然会出现大量的复制、粘贴操作,这样写的代码冗余太多,因此必须要提供上层抽象的DAO类,并且实现通用的CRUD方法。    以下是一些网友的见解:    http://www.ibm.com/developerworks/cn/java/j-genericdao.html 

Young_suse的专栏 1098

第14.1章 高翔博士2025年11月最新开源框架Lightning-LM源码学习解读(一):激光-IMU定位+建图算法各模块简介

Lightning-LM:高效激光SLAM定位系统 该框架基于模块化设计,通过激光-IMU融合实现快速建图与定位,核心特点包括: 极速性能:纯CPU运行(建图1.2核/定位0.8核) 模块化架构:包含激光里程计(LIO)、地图管理、回环检测等独立模块 动态场景支持:地图分块加载、动静态图层分离 多模式适配:支持ROS2环境下的在线/离线运行 关键模块包括前端里程计(core/lio)、2D/3D地图转换(core/g2p5)、轻量优化库(core/miao)等,通过系统控制器(core/system)协调流

行知SLAM 2438

VIVADO IP核之FIR插值器多相滤波仿真

网络上有许多文章介绍FIR低通滤波器的使用,包括仿真。关于FIR低通滤波器的使用,我之前的文章已经介绍过了,本文将继续深入介绍FIR插值器多相滤波的使用方法,并将FIR插值多相滤波的结果与MATLAB仿真计算的结果比较,验证了FIR插值器多相滤波使用正确。

m0_66360845的博客 3382

【2022.4.26】空投来袭

元奶牛在做什么?空投像买彩票,你永远不知道哪张彩票会中奖,所以最好多买几张;空投是最好的天使投资,几乎0成本就可以参与到伟大项目的早期;空投的关键在于埋伏和等待,市场不会给浮躁的人奖励;为了不被割韭菜,欢迎加入我的社群,跟我一起埋伏。(私我)一、谁要发空投?靠谱么?【Airdrop】第二大以太坊二层扩容方案(Layer 2)Optimism官网正式宣布发行治理 Token $OP,$OP 初始总供应量为 4,294,967,296 枚,总供应量将以每年 2 %的速度增发。Optimism 基金会将19%代币

meta_cowgirl的博客 5409

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Sui x KuCoin Labs夏季黑客松获奖名单公布,28.5万美元花落谁家?

Sui x KuCoin Labs夏季黑客松,最终获奖名单揭晓!

Sui_Network的博客 387

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

交易所密钥管理:多重签名与多方计算技术解析与实践指南

在区块链与加密货币领域,密钥管理是保障数字资产安全的基石技术,其核心原理在于通过密码学方法控制资产所有权。传统中心化存储方案存在单点故障风险,为此业界发展出多重签名(Multi-Signature)与多方计算(MPC)两大关键技术。多重签名通过多把“物理钥匙”共同控制资产,原理基于区块链脚本或智能合约实现M-of-N阈值签名,技术价值在于提供链上透明性与强审计能力;多方计算则通过秘密共享与协同计算协议,使完整私钥从未在任何单点完整出现,其价值体现在交易成本优化与隐私保护。在应用场景上,两者共同服务于加密货币

weixin_33910759的博客 462

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

HyperCube与以太坊对比:为什么XPZ公链是更好的Layer 2解决方案

在区块链技术快速发展的今天,以太坊作为智能合约平台的先驱面临着交易速度慢、Gas费用高、扩展性有限等挑战。HyperCube(XPZ公链)作为一个革命性的高性能去中心化计算平台,提供了创新的Layer 2解决方案,为开发者带来了全新的选择。本文将深入分析HyperCube与以太坊的核心差异,揭示为什么XPZ公链是更好的Layer 2解决方案。 ## HyperCube项目简介与核心技术架构 H

gitblog_00486的博客 682

币圈一级市场丨某安领投Ethsign——首个Web3原生协议签署和执行平台

大家好,我是老周。我们会不定期整理一级市场中优质的分享给大家,如果你觉得二级市场风险大,不妨尝试下一级市场。 随着一级市场越来越火热,很多人只是听说却不知怎么去参与,完全不知道一级市场的存在。现在市场不好,好多币友都开始转战一级市场。 项目介绍: EthSign 智能协议 (SA) 是我们即将推出的可定制框架,它通过强制执行智能合约来使电子协议具有更严格的约束力。 在 Chainlink 预言机和 Keepers 的支持下,SA 使电子协议的条款能够根据预先确定的、可测量的链上/链下触发条.

BTC504的博客 649

对称、非对称公钥加密是如何工作的?

作者:Shiva Sai Kumar B来源:区块链大本营(ID:blockchain_camp)加密技术让区块链技术变得更加强大,并逐渐从其他技术中脱颖而出。密码学使用了先进的数学原理...

weixin_44383880的博客 300

Sphinx 官方 FAQ 深度解读:常见问题、生态集成与多格式构建实战

> **导读**:本文以 Sphinx 官方文档库中的 [doc/faq.rst](https://link.gitcode.com/i/d8dedf97e95eaa2286b64c14a971eb47) 为骨架,系统梳理 Sphinx 使用中的高频问题——从"如何不加 LaTeX 生成 PDF""如何给章节编号"等日常操作,到 GitHub Pages 发布、Google 搜索替换、EPUB 制

gitblog_00192的博客 232

进一步了解iBATIS-iBATIS官方网站的一些翻译

序言 对iBATIS框架产生了浓厚的兴趣,在翻译开发指南文档的同时,晚上在宿舍翻译官方网站的内容,主要有三点想法。 一、让自己更了解iBATIS 二、让更多的人更全面地了解iBATIS,iBATIS中的有些内容在开发指南中是没有的。 三、是自己感谢iBATIS给我开发时带来便捷的一点微不足道的回报。 四、提高一下自己的英语水平 :) 翻译得不行,有兴趣的凑合着看。 ...

小头猪 462

使用javassist修改class文件

<br />使用javassist修改class文件 Firestorm是一个用JAVA写的代码生成工具,可以替你节省很多的代码量,可以说同类软件中功能最强的一个。<br /><br />Firestorm是一个用JAVA写的代码生成工具,可以替你节省很多的代码量,可以说同类软件中功能最强的一个。<br />你可以在网上下载到最新的2.3试用版本,同时网站会发给你一个试用的license文件。既然是试用,<br />那么在使用上肯定有一定的限制。主要限制有3个:<br />    1.只能最多生成5张表的

as_314159265的专栏 2411

DeFi 不可承受之重:跨链桥已成“黑客提款机”

当 Axie Infinity 和 DeFi Kingdoms 等游戏类 DApp 维持着像 Ronin 和 Harmony 等整个生态系统时,Fantom 或 Avalance 等网络协议已经在 DeFi 浪潮中赚的盆满钵满。这些区块链已成为以太坊汽油费和相对缓慢的交易时间的重要替代品。想要一种简单的能在不同区块链上的协议之间移动资产的方法变得比以往任何时候都更加迫切。 这就是区块链跨链桥的诞生之地。 由于多链场景的应用,所有 DeFi DApp 的总锁定价值飙升。截至 2022 年 5 月.

qq_32193015的博客 1005
上一篇: 直接使用Junit测试Spring应用的4点不足
下一篇: 关于OPOA的问题和对策
quickselect
博客等级 码龄20年 1粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值