MyBatis中使用的OGNL表达式可参考:这里
MyBatis中可以使用OGNL的地方有两处:
上面这两处地方在MyBatis中处理的时候都是使用OGNL处理的。
下面通过举例来说明这两种情况的用法。
例一,MySql like 查询:
<select id="xxx" ...>
select id,name,... from country
<where>
<if test="name != null and name != ''">
name like concat('%', #{name}, '%')
if>
where>
select>
上面代码中test的值会使用OGNL计算结果。
例二,通用 like 查询:
<select id="xxx" ...>
select id,name,... from country
<bind name="nameLike" value="'%' + name + '%'"/>
<where>
<if test="name != null and name != ''">
name like #{nameLike}
if>
where>
select>
这里
的value
值会使用OGNL计算。
注:对#{}
或 ${}
方式获取,#{}
可以防止注入。
在通用Mapper中支持一种UUID的主键,在通用Mapper中的实现就是使用了
标签,这个标签调用了一个静态方法,大概方法如下:
<bind name="username_bind"
value='@java.util.UUID@randomUUID().toString().replace("-", "")' />
这种方式虽然能自动调用静态方法,但是没法回写对应的属性值,因此使用时需要注意。
上面like的例子中使用下面这种方式最简单
<select id="xxx" ...>
select id,name,... from country
<where>
<if test="name != null and name != ''">
name like '${'%' + name + '%'}'
if>
where>
select>
这里注意写的是${'%' + name + '%'}
,而不是%${name}%
,这两种方式的结果一样,但是处理过程不一样。
在MyBatis中处理${}
的时候,只是使用OGNL计算这个结果值,然后替换SQL中对应的${xxx}
,OGNL处理的只是${这里的表达式}
。
这里表达式可以是OGNL支持的所有表达式,可以写的很复杂,可以调用静态方法返回值,也可以调用静态的属性值。
xxx.map.xml里面的用法:
OGNL.java (Ognl.java 必须放在class目录,也就是没有包名)
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
import com.hotent.core.util.BeanUtils;
public class Ognl {
public Ognl() {
}
public static boolean isEmpty(Object o) throws IllegalArgumentException {
return BeanUtils.isEmpty(o);
}
public static boolean isNotEmpty(Object o) {
return !isEmpty(o);
}
public static boolean isNotEmpty(Long o) {
return !isEmpty(o);
}
public static boolean isNumber(Object o) {
return BeanUtils.isNumber(o);
}
}
参考文档:MyBatis中的OGNL教程
深入了解MyBatis参数