MyBatis的动态SQL执行流程

简介: 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 表达式,实现业务逻辑的定制化查询和操作。

 

相关文章
|
7天前
|
SQL XML Java
mybatis 调用修改SQL时 出现了一个问题 没有修改成功也没有报错
mybatis 调用修改SQL时 出现了一个问题 没有修改成功也没有报错
16 0
|
2月前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
22 1
|
2月前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
30 1
|
2月前
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
16 1
|
2月前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
25 1
|
2月前
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
22 2
|
2月前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
16 1
|
5天前
|
Java 关系型数据库 数据库连接
MyBatis 执行流程分析
MyBatis 执行流程分析
11 2
|
21天前
|
Java 关系型数据库 MySQL
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
|
29天前
|
SQL 关系型数据库 MySQL
【MySQL】慢SQL分析流程
【4月更文挑战第1天】【MySQL】慢SQL分析流程