根据参数查询

news/2025/9/18 10:47:20/文章来源:https://www.cnblogs.com/sly-345/p/19098308
<!--    根据参数查询--><select id="listByMap" resultMap="ResultMapManage" parameterType="map">select <include refid="Manage_field"/>from manage where 1=1<include refid="Manage_where"/></select>

整体含义

这段代码的目的是:根据一个 Map 对象中提供的键值对作为条件,动态地查询 manage 表中的记录。 查询结果会通过之前定义的 ResultMapManage 映射规则,被转换为 Manage 实体对象的集合。


代码逐层解析

1. <select> 标签

<select id="listByMap" resultMap="ResultMapManage" parameterType="map">
  • id="listByMap":这个 SQL 片段的唯一标识符。在对应的 Mapper 接口中,会有一个同名的方法:

     
    public interface ManageMapper {List<Manage> listByMap(Map<String, Object> map);
    }
  • resultMap="ResultMapManage":指定查询结果的映射规则。这里引用了一个名为 ResultMapManage 的 <resultMap>(在你之前的代码中叫 ResultMapMange,注意拼写可能不同)。它负责将查询到的数据库字段映射到 Manage 对象的属性上。

  • parameterType="map"这是关键所在。它指定传入参数的类型是 MyBatis 内置的 map 别名,对应 Java 中的 java.util.Map<String, Object> 接口(通常是 HashMap 实现)。这意味着方法接收一个 Map 对象作为查询条件。

2. SQL 主体

sql
select <include refid="Manage_field"/>from manage where 1=1
<include refid="Manage_where"/>
  • select <include refid="Manage_field"/> from manage:查询 manage 表。<include refid="Manage_field"/> 会被替换为之前定义好的字段列表(如 id, userName, passWord, realName),避免了手动书写和保证一致性。

  • where 1=1:和删除语句中一样,这是一个“万能”的起始条件,目的是为了后面能安全地拼接 AND 条件,避免语法错误。

  • <include refid="Manage_where"/>这是实现动态查询的核心。它引入了一个动态 SQL 片段。

3. 关键的 Manage_where 动态片段(推测内容)

虽然你没有提供 Manage_where 的具体定义,但根据 MyBatis 的常规用法,它几乎肯定包含了 <if> 标签,并且其 test 属性中的判断条件是基于 Map 的键

一个典型的、与 parameterType="map" 配合的 Manage_where 片段会是这样:

xml
<sql id="Manage_where"><if test="id != null">AND id = #{id}</if><if test="userName != null">AND user_name = #{userName}</if><if test="realName != null">AND real_name = #{realName}</if><!-- 可以根据需要继续添加其他字段的条件 -->
</sql>

请注意这里的关键变化:

  • 当 parameterType 是实体类(如 Manage)时,test 中判断的是实体类的属性:test="userName != null"(检查 manage.getUserName())。

  • 当 parameterType 是 map 时,test 中判断的是 Map 中的 Keytest="userName != null"(检查 map.containsKey("userName") && map.get("userName") != null)。


工作流程与示例

假设调用:

java
// 1. 创建一个条件 Map
Map<String, Object> conditionMap = new HashMap<>();
conditionMap.put("userName", "admin"); // 要查询用户名为 'admin' 的记录
conditionMap.put("realName", "张");     // 并且真实姓名包含 '张'// 2. 调用方法
List<Manage> manageList = manageMapper.listByMap(conditionMap);

MyBatis 的处理过程:

  1. 接收到参数 conditionMap,里面有两个键值对:{"userName": "admin", "realName": "张"}

  2. 开始构建 SQL:select id, userName, passWord, realName from manage where 1=1

  3. 处理 <include refid="Manage_where"/>

    • test="id != null":检查 conditionMap 是否有 key 为 "id" 且值不为 null 的项。没有,所以忽略。

    • test="userName != null":检查 conditionMap 是否有 key 为 "userName" 且值不为 null 的项。,值为 "admin",所以追加 AND user_name = #{userName}

    • test="realName != null":检查 conditionMap 是否有 key 为 "realName" 且值不为 null 的项。,值为 "张",所以追加 AND real_name = #{realName}

  4. 最终生成的 SQL

    sql
    SELECT id, userName, passWord, realName 
    FROM manage 
    WHERE 1=1 
    AND user_name = ? 
    AND real_name = ?

    ? 占位符会被替换为 "admin" 和 "张"

  5. 执行查询,并将结果集通过 ResultMapManage 映射成 List<Manage> 返回。

优势与用途

  1. 极致的灵活性:调用者可以传递任意数量、任意组合的查询条件。你可以根据 id 查,也可以根据 userName 和 realName 组合查,甚至可以传入完全不同的条件(比如 status),只需在 Map 里放入相应的键值对并在 Manage_where 片段中配置好对应的 <if> 标签即可。

  2. 避免编写大量类似方法:如果没有这个通用方法,你可能需要为每一种查询组合都写一个单独的方法(如 listByIdlistByUserNamelistByUserNameAndRealName),非常冗余。

  3. 适用于高级查询功能:这种模式非常常用于后台管理系统的高级搜索/筛选功能,用户在前端选择不同的字段输入不同的值,后端将这些条件收集到一个 Map 里,然后直接调用这个通用的 listByMap 方法。

总结: 这段代码定义了一个通用的、基于 Map 条件动态查询的方法。它利用 MyBatis 的动态 SQL 能力,根据传入 Map 中包含的键值对,智能地生成带有相应 WHERE 条件的查询语句,是实现灵活查询的经典模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于非侵入式脑机接口面向C端一个应用想法

目前,脑机接口行业发展如火如荼,但应用仍高度集中在医疗领域,比如运动功能康复等。这类方向不仅技术相对成熟,也更易获得商业回报——毕竟无论是医院还是患者,都更愿意为“恢复健康”买单。然而,若希望脑机接口能…

Blelloch并行扫描算法

本文介绍了一个可以用于并行化串行累计操作的Blelloch算法,可以通过用空间换时间+并行计算的方法,来降低特定计算的时间复杂度。这里我们给出了算法原理的大致介绍,以及基于Numpy的算法代码实现。技术背景 由于现代…

mysql win10

mysql win10https://cloud.tencent.com/developer/article/2392929

「Java EE开发指南」如何用MyEclipse开发Java EE企业应用程序?(二)

「Java EE开发指南」如何用MyEclipse开发Java EE企业应用程序?(二)本教程介绍了Java EE企业应用程序开发入门所需的基本特性、概念和技术。您将学习如何:创建企业应用程序(EAR)项目 添加和删除模块 打包、部署和…

字符串转 python 对象 eval

s = [ { label: "苹果", value: "origin_event_data", icon: "icon-a", color: "#409EFF", bgColor: "#ECF5FF", borderColor:…

牛客刷题-Day1

动态规划1:线性dp、背包问题,区间 https://ac.nowcoder.com/acm/contest/24213?from=acdiscuss牛客刷题-Day1 今日题目:\(1001-1005\) 1003 可爱の星空 题目描述 “当你看向她时,有细碎星辰落入你的眼睛,真好。”…

TENGJUN防水TYPE-C 16PIN连接器技术解析:从结构设计到认证标准的全面解读 - 实践

TENGJUN防水TYPE-C 16PIN连接器技术解析:从结构设计到认证标准的全面解读 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

第三届人工智能与自动化控制国际学术会议(AIAC 2025)

第三届人工智能与自动化控制国际学术会议(AIAC 2025) 2025 3rd International Conference on Artificial Intelligence and Automation Control 第三届人工智能与自动化控制国际学术会议(AIAC 2025)将于2025年10月…

图纸安全外发平台全解析

内容概要 图纸安全外发平台是一个专为解决企业图纸外发难题而设计的系统。简单来说,图纸安全外发平台是什么?它就是一个集数据加密、访问控制于一体的在线平台,旨在保障设计图纸在传输过程中的安全性。其中,像Ftra…

webshell流量 - voasem

菜刀、蚁剑、冰蝎、哥斯拉是常见的webshell管理工具。 在攻防演练中,了解其常见webshell管理工具的流量特征对防守方来说十分重要。常见的webshell也在不断发展以绕过安全设备waf的检测,其流量特征也在不断演变,我们…

MMoE学习笔记:利用门控专家网络高效建模多任务关系

MMoE学习笔记:利用门控专家网络高效建模多任务关系MMoE学习笔记:利用门控专家网络高效建模多任务关系 引言 多任务学习(Multi-Task Learning, MTL)已成为大规模推荐系统、计算广告等工业应用领域的标准技术范式。它…

DE23-Lite的串口回环测试

DE23-Lite的串口回环测试DE23-Lite开发板提供了一个UART接口,用户能够通过主机与Agilex 3 FPGA进行串口通信。该接口通过USB Blaster III电路中的FT2232H芯片实现。将USB线连接到DE23-Lite板的Type-C接口和主机之间,…

基于pyspark的双十一美妆数据分析及可视化 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Linux下显卡驱动简单测试

Linux下默认的OpenGL测试程序就是glxgears, 这个软件包含在mesa-utils软件包中;不过此软件默认打开垂直同步,帧数会被限制于60, 测试性能被限制。 所以, 在运行时如下:> vblank_mode =0 glxgears [return] 即可…

大模型三阶段训练方法(LLaMa Factory)

https://blog.csdn.net/2401_85373691/article/details/144685682Rust编程语言群 1036955113 java新手自学群 626070845 java/springboot/hadoop/JVM 群 4915800 Hadoop/mongodb(搭建/开发/运维)Q群481975850GOLang …

算法与数据结构 8 - 线性筛求一般积性函数

引言 昨天和同学做 LOJ #124. 除数函数求和 1,推出了线性筛求一般积性函数的方法,现在写一写。 前置知识 积性函数:对任意互质整数 \(p,q\),\(f(p)\times f(q)=f(pq)\) 的函数。 完全积性函数:对任意整数 \(p,q\)…

SpringMVC使用jasypt加密配置文件 - Commissar

1、引入jasypt依赖库: <!-- Jasypt核心库 --><dependency> <groupId>org.jasypt</groupId> <artifactId>jasypt</artifactId> <version>1.9.3</version>&l…

三行Python代码实现深度学习推理:Infery全面解析

Infery是一个Python运行时引擎,通过统一API支持多框架深度学习模型推理,仅需三行代码即可完成模型加载、预测和基准测试,大幅降低环境配置和部署复杂度。Infery — 仅用3行Python代码运行深度学习推理 想象一下,通…

基于Python+Vue开发的口腔牙科预约管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的口腔牙科预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习…

网页禁止复制

网页禁止复制网页禁止复制, 我想复制网页的文字内容,有什么办法 当网页禁止复制文字时,可以通过以下多种方法来实现文字内容的复制:使用浏览器开发者工具关闭 JavaScript:在 Chrome 浏览器中,按下 F12 或 Ctrl+Sh…