Mybatis源码-OGNL表达式

76 阅读1分钟

OGNL 主要是Mybatis内部用来判断条件的工具。 例如

<if test="id != null">
    and id = #{id}
</if>

if 标签中的 test = "id != null" ,这里的 id != null 就会借助 OGNL 表达式进行判断,如果 user对象的 id 属性不为 null, 那么就会拼接上 sql "and id = #{id}"

示例:

@Test
public void ognlTest() {
    User user = new User();
    user.setId("1");
    user.setName("张三");
    List<Integer> list = Arrays.asList(1,2,3,4);
    user.setList(list);

    ExpressionEvaluator evaluator = new ExpressionEvaluator();
    // 1. 访问属性
    assert evaluator.evaluateBoolean("id != null && name != null", user);
    // 2. 调用方法
    assert evaluator.evaluateBoolean("list.size() == 4", user);
    assert evaluator.evaluateBoolean("list.get(0) == 1", user);
    // 3. 直接通过下标访问
    assert evaluator.evaluateBoolean("list[1] == 2", user);
    // 4. 迭代
    Iterable<Integer> iterable = (Iterable<Integer>) evaluator.evaluateIterable("list", user);
    AtomicInteger index = new AtomicInteger(1);
    iterable.forEach(i -> {
        assert i == index.getAndIncrement();
    });
}