MyBatis 是一种流行的持久层框架,提供了动态 SQL 的功能,可以根据条件灵活地构建 SQL 查询语句。以下是 MyBatis 动态 SQL 的基本执行流程:
- 解析 SQL 语句:MyBatis 首先会解析 Mapper XML 文件中定义的 SQL 语句,包括静态和动态部分。静态 SQL 部分是固定的 SQL 代码,而动态 SQL 部分则根据条件进行动态生成。
- 构建 SQL 节点树:解析过程中,MyBatis 会根据 XML 文件中定义的标签(如<if>、<choose>、<trim>等)构建一个 SQL 节点树。每个节点表示一个 SQL 片段或条件。
- 检查动态 SQL 条件:MyBatis 会对 SQL 节点树进行检查,判断是否满足动态 SQL 的条件。例如,<if>标签中的条件为真时,对应的 SQL 片段会被包含在最终的 SQL 语句中;否则,该 SQL 片段会被忽略。
- 动态生成最终 SQL 语句:根据条件的判断结果,MyBatis 会遍历 SQL 节点树,递归地生成最终的 SQL 语句。在生成过程中,MyBatis 会根据节点的类型和属性,拼接相应的 SQL 片段。
- 参数绑定:生成最终的 SQL 语句后,MyBatis 会将查询参数与 SQL 语句进行绑定。这样可以保证查询参数的安全性,并且可以重用 SQL 语句。
- 执行 SQL 语句:最终生成的 SQL 语句会被传递给数据库执行。MyBatis 会调用底层的 JDBC API 来执行 SQL 语句,并获取结果。
- 返回查询结果:数据库执行完 SQL 语句后,MyBatis 会将查询结果(如果有)转换为 Java 对象,并返回给调用方。可以根据 Mapper XML 文件中定义的映射关系来进行对象与数据库结果集的映射。
通过动态 SQL 的功能,MyBatis 可以根据不同的条件生成不同的 SQL 语句,从而实现更灵活、可复用的查询操作。
OGNL(Object-Graph Navigation Language,对象图导航语言)是 MyBatis 框架中使用的一种表达式语言,用于在动态 SQL 中访问和操作对象的属性和方法。它具有简洁、灵活和强大的特性,可以方便地进行对象图的导航和操作。
扩展一些原理:
MyBatis 使用 OGNL 来解析动态 SQL 中的表达式,如<if>、<choose>、${}等标签中的表达式。下面是 OGNL 的一些常见用法:
- 访问对象属性:使用.来访问对象的属性,例如user.name表示访问 user 对象的 name 属性。
- 调用对象方法:使用.和()来调用对象的方法,例如user.getName()表示调用 user 对象的 getName 方法。
- 访问集合元素:使用[]来访问集合中的元素,例如list[0]表示访问 list 集合的第一个元素。
- 调用静态方法:使用@类名@方法名的形式来调用类的静态方法,例如@java.lang.Math@random()表示调用 Math 类的 random 方法。
- 条件表达式:可以使用三元运算符(? :)实现条件判断,例如status == 0 ? '未开始' : '已完成'表示根据 status 的值判断返回不同的字符串。
- 集合投影:可以使用#符号来表示当前集合元素的变量,例如#item.name表示访问当前集合元素的 name 属性。
OGNL 可以嵌套使用,允许对复杂对象图进行导航和操作。它提供了丰富的运算符、函数和语法特性,适用于各种复杂的表达式计算和数据处理需求。
在 MyBatis 中,OGNL 在解析动态 SQL 表达式的同时,还可以与数据库查询参数进行绑定,从而实现动态 SQL 的灵活性和可重用性。通过使用 OGNL,我们可以在 Mapper XML 文件中编写简洁、可读性高的动态 SQL 表达式,实现业务逻辑的定制化查询和操作。