1. 从“硬编码”到“动态生成”:为什么我们需要OGNL表达式?
如果你写过Mybatis的XML映射文件,肯定遇到过这样的场景:一个查询接口,前端传过来的参数五花八门,有时候要按名字查,有时候要按年龄查,有时候两个都要。最笨的办法是什么?写一堆if-else,在Java代码里拼接SQL字符串。我早期项目里就这么干过,结果一个查询方法动辄上百行,改个条件就像在走钢丝,生怕把哪个and或者空格给弄错了。
后来用上了Mybatis的动态SQL标签,像<if>、<choose>,感觉世界一下子清爽了。但很快,新的问题又来了:<if test="name != null">,这个test里面的表达式到底是什么?它为什么能直接写name,又能调用对象的方法?这就是我们今天要聊的OGNL(Object-Graph Navigation Language)表达式在幕后起作用。
简单来说,OGNL就是Mybatis动态SQL的“灵魂语法”。它是一套小巧而强大的表达式语言,专门用来在Mybatis的XML文件里,访问你传入的Java对象属性、调用方法、进行逻辑判断。没有它,<if>、<choose>、<foreach>这些标签就只是一堆没有生命的静态文本。正是OGNL赋予了它们“动态”的能力,让SQL能根据运行时的数据条件灵活变化。
我打个比方,Mybatis的XML映射文件就像一个烹饪食谱。静态SQL是固定菜谱:“西红柿炒鸡蛋,需要西红柿两个,鸡蛋三个”。而结合了OGNL的动态SQL,就变成了智能菜谱:“如果有西红柿,就放西红柿;如果有鸡蛋,就放鸡蛋;如果都有,就做西红柿炒鸡蛋;如果只有鸡蛋,就做炒鸡蛋”。OGNL就是这套“如果…就…”的判断逻辑本身。理解并掌握OGNL,你才能从“照搬菜谱”的学徒,变成“灵活掌勺”的大厨,写出既清晰又强大的数据访问层代码。接下来,我们就抛开那些晦涩的定义,直接上手,看看它到底怎么用,以及如何用得漂亮。
2. OGNL表达式核心语法:像访问对象一样写SQL条件
很多教程一上来就列一堆OGNL的规范,看得人头大。咱们换个方式,我直接带你看看在Mybatis的<if test="">里最常用的几种写法,你立刻就能明白。
2.1 基础属性访问:你的参数对象“直达车”
这是最常用,也最直观的。假设你Mapper接口的方法签名是List<User> selectByCondition(User user),传入了一个User对象,它有id、name、age属性。在XML里,你可以直接这么写:
<select id="selectByCondition" resultType="User">
SELECT * FROM user
<where>
<if test="name != null and name != ''">
AND name = #{name}
</if>
<if test="age != null and age gt 0">
AND age = #{age}
</if>
</where>
</select>
注意看test里的表达式:
name != null:这里的name,指的就是传入的User对象的name属性。OGNL会自动帮你从根对象(这里就是User对象)开始导航。and:这是OGNL中的逻辑与运算符,不是Java的&&。同样,逻辑或是or,不是||。age gt 0:这里的gt是OGNL表示“大于”的特殊运算符。因为XML中>、<这些符号有特殊含义,所以OGNL用文本替代:gt对应>lt对应<gte对应>=lte对应<=eq对应==neq对应!=

3114

被折叠的 条评论
为什么被折叠?



