MyBatis之OGNL的应用

MyBatis中使用的OGNL表达式可参考:这里

MyBatis中可以使用OGNL的地方有两处:

  • 动态SQL表达式中
  • ${param}参数中

上面这两处地方在MyBatis中处理的时候都是使用OGNL处理的。

下面通过举例来说明这两种情况的用法。

1.动态SQL表达式中

例一,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("-", "")' />
  • 1
  • 2

这种方式虽然能自动调用静态方法,但是没法回写对应的属性值,因此使用时需要注意。

2.${param}参数中

上面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支持的所有表达式,可以写的很复杂,可以调用静态方法返回值,也可以调用静态的属性值。

mybatis中使用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参数


你可能感兴趣的:(java,Web框架)