OGNL用法
在 MyBatis 的动态 SQL 和 ${}
形式的参数中都用到了 OGNL 表达式,所以我们有必要了解一下 OGNL 的简单用法。MyBatis 常用的 OGNL 表达式如下。
-
e1 or e2
-
e1 and e2
-
e1 == e2 或 e1 eq e2
-
e1 != e2 或 e1 neq e2
-
e1 lt e2:小于
-
e1 lte e2:小于等于,其他表示为 gt(大于)、gte(大于等于)
-
e1+e2、e1*e2、e1/e2、e1-e2、e1%e2
-
!e 或 not e:非,取反
-
e.method(args):调用对象方法
-
e.property:对象属性值
-
e1[e2]:按索引取值(List、数组和 Map)
-
@class@method(args):调用类的静态方法
-
@class@field:调用类的静态字段值
表达式 1~4 是最常用的4种情况。另外有些时候当需要判断一个集合是否为空时,可能会出现如下判断。
<if test="list != null and list.size() > 0">
<!-- 其它 -->
</if>
在这种用法中,list.size() 是调用对象的方法,>0 是和数字进行比较。
表达式 10、11 两种情况也特别常见,而且可以多层嵌套使用。假设 User 类型的属性 user 中有一个 Address 类型的属性名为 addr,在 Address 中还有一个属性 zipcode,可以通过 user.addr.zipcode 直接使用 zipcode 的值。假设 Map 类型的属性为 map,我们可以通过 map['userName'] 或 map.userName 来获取 map 中 key 为 userName 的值,这里一定要注意,不管 userName 的值是不是 null,必须保证 userName 这个 key 存在,否则就会报错。表达式 12 通常用于简化一些校验,或者进行更特殊的校验,例如 if 中常见的判断可以写成如下这样。
<if test="@tk.mybaits.util.StringUtil@isNotEmpty(userName)">
and user_name like concat('%', #{userName}, '%')
</if>
其中 StringUtil 类如下。
public class StringUtil {
public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
public static boolean isNotEmpty(String str) {
return !isEmpty(str);
}
}
下面举一个特殊一点的例子。假设只是在测试的时候想知道映射XML中方法执行的参数,可以先在上面的StringUtil中添加如下静态方法。
public static void print(Object parameter) {
System.out.println(parameter);
}
然后在映射文件中的方法标签内添加如下方法。
<bind name="print" value="@tk.mybatis.util.StringUtil@print(_parameter)" />
通过这种方式就能实现一些特殊的功能,这个例子只是为了启发大家,在有些情况下可能会起到非常好的效果,但是要避免乱用,以免给其他人造成混乱。