MyBatis的动态SQL执行流程

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: MyBatis的动态SQL执行流程

MyBatis 是一种流行的持久层框架,提供了动态 SQL 的功能,可以根据条件灵活地构建 SQL 查询语句。以下是 MyBatis 动态 SQL 的基本执行流程:

  1. 解析 SQL 语句:MyBatis 首先会解析 Mapper XML 文件中定义的 SQL 语句,包括静态和动态部分。静态 SQL 部分是固定的 SQL 代码,而动态 SQL 部分则根据条件进行动态生成。
  2. 构建 SQL 节点树:解析过程中,MyBatis 会根据 XML 文件中定义的标签(如<if><choose><trim>等)构建一个 SQL 节点树。每个节点表示一个 SQL 片段或条件。
  3. 检查动态 SQL 条件:MyBatis 会对 SQL 节点树进行检查,判断是否满足动态 SQL 的条件。例如,<if>标签中的条件为真时,对应的 SQL 片段会被包含在最终的 SQL 语句中;否则,该 SQL 片段会被忽略。
  4. 动态生成最终 SQL 语句:根据条件的判断结果,MyBatis 会遍历 SQL 节点树,递归地生成最终的 SQL 语句。在生成过程中,MyBatis 会根据节点的类型和属性,拼接相应的 SQL 片段。
  5. 参数绑定:生成最终的 SQL 语句后,MyBatis 会将查询参数与 SQL 语句进行绑定。这样可以保证查询参数的安全性,并且可以重用 SQL 语句。
  6. 执行 SQL 语句:最终生成的 SQL 语句会被传递给数据库执行。MyBatis 会调用底层的 JDBC API 来执行 SQL 语句,并获取结果。
  7. 返回查询结果:数据库执行完 SQL 语句后,MyBatis 会将查询结果(如果有)转换为 Java 对象,并返回给调用方。可以根据 Mapper XML 文件中定义的映射关系来进行对象与数据库结果集的映射。

通过动态 SQL 的功能,MyBatis 可以根据不同的条件生成不同的 SQL 语句,从而实现更灵活、可复用的查询操作。

OGNLObject-Graph Navigation Language,对象图导航语言)是 MyBatis 框架中使用的一种表达式语言,用于在动态 SQL 中访问和操作对象的属性和方法。它具有简洁、灵活和强大的特性,可以方便地进行对象图的导航和操作。

扩展一些原理:

MyBatis 使用 OGNL 来解析动态 SQL 中的表达式,如<if><choose>${}等标签中的表达式。下面是 OGNL 的一些常见用法:

  1. 访问对象属性:使用.来访问对象的属性,例如user.name表示访问 user 对象的 name 属性。
  2. 调用对象方法:使用.()来调用对象的方法,例如user.getName()表示调用 user 对象的 getName 方法。
  3. 访问集合元素:使用[]来访问集合中的元素,例如list[0]表示访问 list 集合的第一个元素。
  4. 调用静态方法:使用@类名@方法名的形式来调用类的静态方法,例如@java.lang.Math@random()表示调用 Math 类的 random 方法。
  5. 条件表达式:可以使用三元运算符(? :)实现条件判断,例如status == 0 ? '未开始' : '已完成'表示根据 status 的值判断返回不同的字符串。
  6. 集合投影:可以使用#符号来表示当前集合元素的变量,例如#item.name表示访问当前集合元素的 name 属性。

OGNL 可以嵌套使用,允许对复杂对象图进行导航和操作。它提供了丰富的运算符、函数和语法特性,适用于各种复杂的表达式计算和数据处理需求。

MyBatis 中,OGNL 在解析动态 SQL 表达式的同时,还可以与数据库查询参数进行绑定,从而实现动态 SQL 的灵活性和可重用性。通过使用 OGNL,我们可以在 Mapper XML 文件中编写简洁、可读性高的动态 SQL 表达式,实现业务逻辑的定制化查询和操作。

 

相关文章
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
21天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
46 10
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
3月前
|
SQL 缓存 关系型数据库
揭秘MySQL一条SQL语句的执行流程
以上步骤共同构成了MySQL处理SQL语句的完整流程,理解这一流程有助于更有效地使用MySQL数据库,优化查询性能,及时解决可能出现的性能瓶颈问题。
103 7
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
64 1
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
4月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志
|
4月前
|
Java 测试技术 容器
从零到英雄:Struts 2 最佳实践——你的Web应用开发超级变身指南!
【8月更文挑战第31天】《Struts 2 最佳实践:从设计到部署的全流程指南》深入介绍如何利用 Struts 2 框架从项目设计到部署的全流程。从初始化配置到采用 MVC 设计模式,再到性能优化与测试,本书详细讲解了如何构建高效、稳定的 Web 应用。通过最佳实践和代码示例,帮助读者掌握 Struts 2 的核心功能,并确保应用的安全性和可维护性。无论是在项目初期还是后期运维,本书都是不可或缺的参考指南。
54 0