MyBatis动态 SQL 的执行原理

MyBatis 动态 SQL 是 MyBatis 框架中的一个重要特性,它允许开发者根据条件动态地生成不同的 SQL 语句。通过使用动态 SQL,开发者可以根据传入的参数动态地构建 SQL 查询,这样就避免了写多个 SQL 语句,提升了代码的灵活性和可维护性。

1. 动态 SQL 的概念

动态 SQL 指的是 SQL 语句在运行时(而非编译时)根据传入的参数来动态决定 SQL 语句的内容。通过 MyBatis 提供的 <if>, <choose>, <foreach>, <where> 等标签,开发者可以根据不同的条件动态地生成 SQL 语句。

2. MyBatis 动态 SQL 的执行原理

MyBatis 在执行动态 SQL 时,主要的工作流程如下:

  1. SQL 映射文件解析

    • MyBatis 的映射文件(如 mapper.xml)中定义了动态 SQL 语句,这些 SQL 语句通常包含一些动态元素(例如 <if><choose><foreach> 等)。
    • 当执行某个映射方法时,MyBatis 会首先加载并解析对应的映射文件(mapper.xml)中的 SQL 语句。此时,SQL 语句中的动态部分并不会立即生成,只有当方法被调用时,MyBatis 会根据传入的参数来生成最终的 SQL 语句。
  2. 构建 SQL 语句

    • MyBatis 会将 SQL 语句中的动态部分替换为实际的 SQL 语句。例如:
      • <if> 标签根据条件来决定是否包含某部分 SQL。
      • <choose> 标签类似于 Java 中的 if-else,选择不同的 SQL 片段。
      • <foreach> 标签用于循环生成多个 SQL 片段,通常用于处理集合或数组。
    • MyBatis 会通过解析 parameterType 参数(例如,Map 或 POJO 对象)来判断条件和动态内容。
  3. SQL 语句生成

    • 动态部分通过 MyBatis 内部的 SQL 构建器生成最终的 SQL 语句。MyBatis 会使用 Java 的 OGNL(Object-Graph Navigation Language)表达式来获取参数的属性值,决定哪些 SQL 片段应该被包括在内。
  4. SQL 语句执行

    • 生成完整的 SQL 语句后,MyBatis 会交给数据库执行。
    • 这个 SQL 语句会根据数据库的返回结果进行映射,最终返回给应用程序。
  5. 返回结果

    • 执行 SQL 后,MyBatis 会根据 SQL 查询结果和映射文件中的映射规则,将查询结果封装为 Java 对象并返回。

3. MyBatis 动态 SQL 的常用标签

MyBatis 提供了丰富的标签来实现动态 SQL,以下是几个常用的标签及其作用:

(1) <if>
  • 作用:根据条件判断是否包括某部分 SQL 语句。

  • 用法:当条件为 true 时,包含该部分 SQL,否则跳过。

    <select id="findUser" resultType="User"> SELECT * FROM user WHERE 1 = 1 <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </select>

    这段代码中,只有在 nameage 不为 null 时,对应的 SQL 部分才会被加入。

(2) <choose><when><otherwise>
  • 作用:类似于 Java 中的 if-else 语句,根据不同的条件选择 SQL 片段。

    <select id="findUser" resultType="User"> SELECT * FROM user WHERE 1 = 1 <choose> <when test="name != null"> AND name = #{name} </when> <when test="age != null"> AND age = #{age} </when> <otherwise> AND status = 'ACTIVE' </otherwise> </choose> </select>

    如果 name 不为 null,会选择第一个 <when> 语句,否则会选择第二个 <when> 语句,如果都不满足条件,则执行 <otherwise> 语句。

(3) <foreach>
  • 作用:用于处理集合(如列表、数组)类型的参数,生成 SQL 语句中相应的重复部分。

    <select id="findUsersByIds" resultType="User"> SELECT * FROM user WHERE id IN <foreach item="id" collection="list" open="(" close=")" separator=","> #{id} </foreach> </select>

    这个 SQL 会将传入的 list 集合的每个元素都作为 id 值生成 IN 条件。

(4) <where>
  • 作用:用于自动为 SQL 添加 WHERE 关键字,并且处理 SQL 中的多余 ANDOR

    <select id="findUser" resultType="User"> <where> <if test="name != null">AND name = #{name}</if> <if test="age != null">AND age = #{age}</if> </where> </select>

    使用 <where> 后,MyBatis 会自动处理 ANDOR,避免 SQL 开头出现多余的 ANDOR

(5) <set>
  • 作用:用于更新 SQL 语句中的 SET 子句,自动处理逗号的添加与删除。

    <update id="updateUser"> UPDATE user <set> <if test="name != null">name = #{name},</if> <if test="age != null">age = #{age},</if> </set> WHERE id = #{id} </update>

    使用 <set> 标签后,MyBatis 会自动处理 SET 子句中的逗号问题。

4. MyBatis 动态 SQL 的执行过程

  1. SQL 语句生成:通过动态 SQL 标签(<if><foreach><choose><where> 等)构建最终的 SQL 语句。
  2. 传入参数:在执行查询时,MyBatis 会传入相应的参数,执行动态 SQL 时根据参数判断条件。
  3. 执行 SQL:生成最终的 SQL 后,MyBatis 会将其交给底层的数据库执行。
  4. 结果映射:执行结果会返回并映射为 Java 对象。

5. 总结

MyBatis 的动态 SQL 提供了强大的功能,使得开发者能够灵活地生成复杂的 SQL 查询。通过使用 <if>, <foreach>, <choose>, <set> 等标签,MyBatis 可以根据参数动态生成 SQL 语句,避免了写多个 SQL 的繁琐工作。理解 MyBatis 动态 SQL 的执行原理可以帮助你编写更灵活且高效的数据库操作代码。

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

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

相关文章

SD ComfyUI工作流 对人物图像进行抠图并替换背景

文章目录 人物抠图与换背景SD模型Node节点工作流程工作流下载效果展示人物抠图与换背景 此工作流旨在通过深度学习模型完成精确的人物抠图及背景替换操作。整个流程包括图像加载、遮罩生成、抠图处理、背景替换以及最终的图像优化。其核心基于 SAM(Segment Anything Model)与…

微服务-1 认识微服务

目录​​​​​​​ 1 认识微服务 1.1 单体架构 1.2 微服务 1.3 SpringCloud 2 服务拆分原则 2.1 什么时候拆 2.2 怎么拆 2.3 服务调用 3. 服务注册与发现 3.1 注册中心原理 3.2 Nacos注册中心 3.3 服务注册 3.3.1 添加依赖 3.3.2 配置Nacos 3.3.3 启动服务实例 …

02-18.python入门基础一基础算法

&#xff08;一&#xff09;排序算法 简述&#xff1a; 在 Python 中&#xff0c;有多种常用的排序算法&#xff0c;下面为你详细介绍几种常见的排序算法及其原理、实现代码、时间复杂度以及稳定性等特点&#xff0c;并对比它们适用的场景。 冒泡排序&#xff08;Bubble Sor…

深度学习blog-卷积神经网络(CNN)

卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种广泛应用于计算机视觉领域&#xff0c;如图像分类、目标检测和图像分割等任务中的深度学习模型。 1. 结构 卷积神经网络一般由以下几个主要层组成&#xff1a; 输入层&#xff1a;接收…

三维扫描在汽车/航空行业应用

三维扫描技术应用范围广泛&#xff0c;从小型精密零件到大型工业设备&#xff0c;都能实现快速、准确的测量。 通过先进三维扫描技术获取产品和物体的形面三维数据&#xff0c;建立实物的三维图档&#xff0c;满足各种实物3D模型数据获取、三维数字化展示、3D多媒体开发、三维…

【Axure视频教程】中继器表格间传值

今天教大家在Axure制作中继器表格间传值的原型模板&#xff0c;可以将一个中继器表格里的行数据传递到另外一个中继器表格里&#xff0c;包括传值按钮在中继器内部和外部两中案例。 这个原型模板是用中继器制作的&#xff0c;所以使用也很简单&#xff0c;只需要在中继器表格里…

【测试】接口测试

长期更新好文&#xff0c;建议关注收藏&#xff01; 目录 接口规范接口测试用例设计postmanRequests 复习HTTP超文本传输协议 复习cookiesession 实现方式 1.工具 如postman ,JMeter&#xff08;后者功能更全&#xff09; 2.代码 pythonrequests / javahttpclient【高级】 接…

目录 1、常用系统数据类型 1. int或integer 2. tinyint 3. decimal[(p[,s])]或numeric[(p[,s])] 4. char(n) 5. varchar(n|max) 6. datetime 2、T-SQL创建表 3、T-SQL修改表 4、T-SQL表数据的操作 4.1 插入数据 4.2 修改数据 4.3 删除数据 5、删除表 1、常用系统…

【LLM】OpenAI 的DAY12汇总和o3介绍

note o3 体现出的编程和数学能力&#xff0c;不仅达到了 AGI 的门槛&#xff0c;甚至摸到了 ASI&#xff08;超级人工智能&#xff09;的边。 Day 1&#xff1a;o1完全版&#xff0c;开场即巅峰 12天发布会的开场即是“炸场级”更新——o1完全版。相比此前的预览版本&#x…

Redis缓存知识点汇总

Redis缓存知识点汇总 请先思考如下问题 1.Redis的缓存击穿&#xff0c;穿透&#xff0c;雪崩是什么意思&#xff1f;原因和解决方案有哪些&#xff1f; 2.Redis支持宕机数据恢复&#xff0c;他的持久化方式及其原理是什么&#xff1f; 3.如何保证双写一致性&#xff0c;即如何保…

Gitlab17.7+Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用)

一、gitlab设置&#xff1a; 1、进入gitlab选择主页在左侧菜单的下面点击管理员按钮。 2、选择左侧菜单的设置&#xff0c;选择网络&#xff0c;在右侧选择出站请求后选择允许来自webhooks和集成对本地网络的请求 3、webhook设置 进入你自己的项目选择左侧菜单的设置&#xff…

仓颉编程笔记1:变量函数定义,常用关键字,实际编写示例

本文就在网页版上体验一下仓颉编程&#xff0c;就先不下载它的SDK了 基本围绕着实际摸索的编程规则来写的 也没心思多看它的文档&#xff0c;写的不太明确&#xff0c;至少我是看的一知半解的 文章提供测试代码讲解、测试效果图&#xff1a; 目录 仓颉编程在线体验网址&…

Linux 文件 I/O 基础

目录 前言 一、文件描述符&#xff08;File Descriptor&#xff09; 二、打开文件&#xff08;open 函数&#xff09; 三、读取文件&#xff08;read 函数&#xff09; 四、写入文件&#xff08;write 函数&#xff09; 五、关闭文件&#xff08;close 函数&#xff09; …

Vue项目中env文件的作用和配置

在实际项目的开发中&#xff0c;我们一般会经历项目的开发阶段、测试阶段和最终上线阶段&#xff0c;每一个阶段对于项目代码的要求可能都不尽相同&#xff0c;那么我们如何能够游刃有余的在不同阶段下使我们的项目呈现不同的效果&#xff0c;使用不同的功能呢&#xff1f;这里…

20241130 RocketMQ本机安装与SpringBoot整合

目录 一、RocketMQ简介 ???1.1、核心概念 ???1.2、应用场景 ???1.3、架构设计 2、RocketMQ Server安装 3、RocketMQ可视化控制台安装与使用 4、SpringBoot整合RocketMQ实现消息发送和接收? ? ? ? ? 4.1、添加maven依赖 ???4.2、yaml配置 ???4.3、…

“宠物服务的跨平台整合”:多设备宠物服务平台的实现

2.1 SSM框架介绍 本课题程序开发使用到的框架技术&#xff0c;英文名称缩写是SSM&#xff0c;在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等&#xff0c;作为一个课题程序采用SSH框架也可以&#xff0c;SSM框架也可以&#xff0c;SpringMVC也可以。SSH框架是属于重量级…

Word表格另起一页解决办法

Word表格另起一页解决办法 表格设置根据内容自动调整&#xff0c;取消指定高度第1步 第2步

iOS Masonry对包体积的影响

01 Masonry介绍 Masonry是iOS在控件布局中经常使用的一个轻量级框架&#xff0c;Masonry让NSLayoutConstraint使用起来更为简洁。Masonry简化了NSLayoutConstraint的使用方式&#xff0c;让我们可以以链式的方式为我们的控件指定约束。 常用接口声明与实现&#xff1a; 使用方式…

抖去推碰一碰系统技术源码/open SDK转发技术开发

抖去推碰一碰系统技术源码/open SDK转发技术开发 碰一碰智能系统#碰碰卡系统#碰一碰系统#碰一碰系统技术源头开发 碰碰卡智能营销系统开发是一种集成了人工智能和NFC技术的工具&#xff0c;碰碰卡智能营销系统通过整合数据分析、客户关系管理、自动化营销活动、多渠道整合和个…

JS中的闭包和上下文

变量提升 和 函数提升 这里要提到一个提升的概念&#xff0c;即在JS中&#xff0c;在解析代码之前还有一个预处理的过程&#xff0c;这个过程中会把部分变量和函数声明提前到代码的最顶部&#xff0c; 会在其他所有代码之前执行。虽然当我们按照规范&#xff08;严格模式或者T…