insight mybatis 动态sql解析-part2

part1 主要分析动态sql 参数相关的解析,对于xml-> sql 的过程没有详细分析,此文补上。

part1 GO.

增加part2源码分析的原因,工作中遇到的一个bug,mybatis 查询有个参数为0,导致拼接的sql异常。需要定位问题原因。

问题

<!--问题sql片段,入参source=0,导致拼接完的sql没有这个条件 -->
<if test="source != null and source != ''">
    and foo.source = #{source,jdbcType=INTEGER}
</if>

xml test表达式解析实现

关键类:ExpressionEvaluatorIfSqlNode

IfSqlNode 负责解析if 标签的sql片段

ExpressionEvaluator 实现表达式的解析,底层是通过OGNL实现。

上述问题的测试

ExpressionEvaluator evaluator = new ExpressionEvaluator();
// test = true
boolean test = evaluator.evaluateBoolean("source == ''", ImmutableMap.of("source", 0));

源码实现

public boolean evaluateBoolean(String expression, Object parameterObject) {
	try {
		Object value = Ognl.getValue(expression, parameterObject);
		if (value instanceof Boolean) return (Boolean) value;
        // 需要特别注意的是,表达式解析也支持返回为数字,如果为0, 则返回false
		if (value instanceof Number) return !new BigDecimal(String.valueOf(value)).equals(BigDecimal.ZERO);
		return value != null;
	} catch (OgnlException e) {
		throw new BuilderException("Error evaluating expression '" + expression + "'. Cause: " + e, e);
	}
}

问题总结

  • mybatis 利用OGNL生成动态sql
  • OGNL 对于表达式的解析约定和实现,决定了上述问题的出现
  • 代码不能直接copy,要多测试
  • 入参传0,也有些另类!!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值