MyBatis 动态 SQL 为什么这么灵活?背后靠的是 OGNL

本文已收录在Github关注我,紧跟本系列专栏文章,咱们下篇再续!

  • 🚀 魔都架构师 | 全网30W技术追随者
  • 🔧 大厂分布式系统/数据中台实战专家
  • 🏆 主导交易系统百万级流量调优 & 车联网平台架构
  • 🧠 AIGC应用开发先行者 | 区块链落地实践者
  • 🌍 以技术驱动创新,我们的征途是改变世界!
  • 👉 实战干货:编程严选网

0 前言

OGNL(Object Graph Navigation Language,对象图导航语言),在 Struts2 时代是绝对的核心,而在如今 Spring Boot 和 MyBatis 架构,依然在幕后扮演着极其关键的角色。

1 啥是 OGNL?

如果把你的 Java 程序比作一座巨大的城市,里面的对象就是一栋栋大楼,而对象的属性就是大楼里的房间。

1.1 传统方式

你想去某个房间,得亲自走楼梯、开门(手动编写 getUser().getAddress().getCity())。如果中间有一个门锁了(为 null),你就摔倒了(NullPointerException)。

1.2 OGNL 方式

你只需要输入一个地址字符串 "user.address.city",OGNL 就像一个智能导航仪,自动帮你穿梭在大楼之间,找到那个房间并取出东西。

核心定义:OGNL 是一种表达式语言(EL),通过简单的字符串语法,就可存取 Java 对象树中的任意属性、调用方法、甚至进行简单的逻辑运算。

2 MyBatis 中的动态 SQL

OGNL 是 MyBatis 动态 SQL 的灵魂。

2.1 业务背景

假设你正在开发一个电商平台的订单搜索功能 。用户可按订单状态、时间范围、关键词进行筛选。不用 OGNL,可能要写无数个 if-else

2.2 落地实现

MyBatis XML 看到的 test 表达式就是 OGNL:

ini 复制代码
<select id="findOrders" resultType="Order">
   SELECT * FROM orders
   WHERE 1=1
   <if test="status != null and status != ''">
     AND status = #{status}
   </if>
   <if test="keywords != null and keywords.length() > 0">
     AND title LIKE CONCAT('%', #{keywords}, '%')
   </if>
 </select>

为啥这要用 OGNL?因为它解耦"逻辑判断"和"SQL"。你无需在 Java 代码里拼装字符串,只需在 XML 里写简单的"导航公式",OGNL 自动帮你解析参数对象里的值。

3 "热修改"与线上排查

3.1 业务背景

你的微服务已上线,突然发现某接口返回数据异常。你想知:现在内存里某个全局配置变量的值到底是多少? 或想在不重启服务时,临时修改一下某个 Bean 的开关状态

3.2 落地实现:结合 Arthas

Java 诊断利器 Arthas 深度集成 OGNL。可直接在命令行输入 OGNL 表达式来"窥探"运行中的系统。

查看静态变量的值

bash 复制代码
# 查看类中静态变量的值
 ognl '@com.example.ConfigManager@getConfig().getTimeout()'

线上"开挂"修改配置

swift 复制代码
# 动态修改线上运行中的某个开关
 ognl '#config=@com.example.ConfigManager@instance, #config.setEnableDebug(true)'

微服务架构下,节点众多,重启代价大。利用 OGNL 的动态执行能力,可在不触动代码前提下,精准观察和干预生产环境的对象状态。

4 避坑

虽然 OGNL 很强大,但在分布式设计意:

性能损耗

OGNL 毕竟是基于反射和解析的。在高性能、高并发的内层循环中,频繁使用复杂的表达式会导致 CPU 抖动。最佳实践:复杂的逻辑尽量在 Java 代码中处理好,传给 OGNL 的应该是"结果"。

安全风险

这就是著名的"Struts2 漏洞"根源。如果你的系统允许用户输入 OGNL 表达式并在后台执行,攻击者可以通过构造特殊的字符串(如执行 Runtime.getRuntime().exec("rm -rf /"))来控制你的服务器。最佳实践:绝不要将用户输入的参数直接作为 OGNL 表达式执行。

5 总结

OGNL 不是什么深奥的数学模型,它就是一个**"胶水工具"。它让 字符串内存对象**之间建立了一座桥梁:

  • MyBatis 里,它是 SQL 的"指挥官"。
  • Arthas 里,它是线上的"透视镜"。
  • 数据校验 里,它是灵活的"规则引擎"。

掌握了 OGNL,你不仅能写出更优雅的动态 SQL,更能在系统出问题时,通过表达式直接与内存对话。

相关推荐
Thanwinde2 小时前
RBAC介绍以及如何设计一个简易且高可用的RBAC1的鉴权系统
后端·架构
麦麦大数据2 小时前
F060 基于BERTvue+flask电影评论情感分析系统
后端·python·flask·bert·推荐算法·情感分析·电影评论
05大叔2 小时前
Spring Day03
java·后端·spring
程序员码歌2 小时前
短思考第266天,玩IP路上的几点感悟,这几点很重要!
前端·后端·创业
码农BookSea2 小时前
响应式编程不只有概念!万字长文 + 代码示例,手把手带你玩转 RxJava
后端
毕设源码-郭学长3 小时前
【开题答辩全过程】以 基于SpringBoot的足球运动员训练计划管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
海南java第二人3 小时前
Spring Boot自定义注解深度解析:从入门到实战进阶
java·spring boot·后端
qq_12498707533 小时前
悦读圈图书共享微信小程序(源码+论文+部署+安装)
spring boot·后端·微信小程序·小程序·毕业设计·计算机毕业设计
韩立学长3 小时前
【开题答辩实录分享】以《基于springboot洗衣店管理系统的设计与实现》为例进行选题答辩实录分享
java·spring boot·后端