OGNL 表达式简介

OGNL(Object Graph Navigation Language)是一种功能强大的表达式语言,用于访问和操作对象图(Object Graph)。它被广泛应用于 Java 开发中,用来简化对象属性的访问、方法调用、集合操作等。在 MyBatis 中,OGNL 表达式主要用于动态 SQL 生成过程中的条件判断参数解析


OGNL 的主要特点

  1. 对象导航:可以通过类似于 XPath 的方式访问对象属性和嵌套属性。
    • 例如:user.name 表示获取 user 对象的 name 属性。
  2. 集合操作:支持操作列表、数组、Map 等集合类型的数据。
    • 例如:users[0] 表示获取第一个用户,map['key'] 表示获取 Map 中的某个值。
  3. 调用方法:支持调用对象的普通方法和静态方法。
    • 例如:user.getName()@java.lang.Math@max(10, 20)
  4. 条件判断:支持布尔运算、逻辑运算和比较操作。
    • 例如:age > 18name != null

OGNL 在 MyBatis 中的使用

在 MyBatis 中,OGNL 表达式主要用于动态 SQL 的 <if><choose> 等标签中,用来判断条件是否成立或解析参数值。

1. 访问对象的属性

在 MyBatis 的映射文件中,可以使用 OGNL 表达式访问传递参数的属性:

<if test="name != null">
  AND name = #{name}
</if>
  • 如果方法参数是一个 MapMap<String, Object> params = new HashMap<>(); params.put("name", "Alice"); 上述表达式会通过 params.get("name") 获取值。
  • 如果方法参数是一个 JavaBean: User user = new User(); user.setName("Alice"); 表达式会通过 user.getName() 获取值。

2. 调用对象的方法

OGNL 支持在表达式中调用 Java 对象的方法。例如:

<if test="name.startsWith('A')">
  AND name LIKE 'A%'
</if>
  • 这里的 name.startsWith('A') 调用了字符串的 startsWith 方法。

3. 条件判断

OGNL 可用于复杂的条件判断:

<if test="age != null and age > 18">
  AND age > #{age}
</if>
  • 表达式 age != null and age > 18 判断 age 参数是否不为空且大于 18。

4. 处理集合

OGNL 支持访问集合或数组的数据:

<foreach collection="idList" item="id" open="(" separator="," close=")">
  #{id}
</foreach>
  • idList 是传入的一个集合,OGNL 表达式会遍历集合中的每一项。

还可以判断集合是否为空:

<if test="idList != null and idList.size > 0">
  AND id IN
  <foreach collection="idList" item="id" open="(" separator="," close=")">
    #{id}
  </foreach>
</if>

OGNL 的常用操作

类型示例说明
访问属性user.name获取 user 对象的 name 属性值
调用方法user.getName()调用 user 对象的 getName 方法
静态方法@java.lang.Math@max(10, 20)调用 Math 类的 max 静态方法
比较运算age > 18判断 age 是否大于 18
布尔运算name != null and age > 18逻辑与运算
访问集合或数组users[0]获取列表 users 的第一个元素
Map 键值访问map['key']获取 Map 中键为 'key' 的值
判断空值name == null判断变量 name 是否为空

OGNL 在 MyBatis 中的优点

  1. 灵活性:可以根据参数的不同动态生成 SQL。
  2. 简化代码:将条件判断和数据操作直接嵌入 SQL 配置文件,避免了大量 Java 代码。
  3. 强大的功能:支持多种操作,如对象属性访问、集合遍历、方法调用等。

总结

OGNL 表达式是 MyBatis 动态 SQL 的核心工具,负责解析参数并生成灵活的 SQL 语句。它使得开发者能够高效地根据不同的条件动态构建 SQL,从而提高开发效率和代码的可维护性。

相关阅读:MyBatis 动态 SQL 功能介绍