mybatis在xml中使用OGNL取值;比较优先级简述
概述
在业务中如果dao层搭配了mybatis,那么通常会将一些业务查询写入到xml中,并且在过滤一些业务条件时会使用OGNL表达式
比如下面这段OGNL表达式
<if test="null != params.applyTimeStart">
and mpa.apply_time >= #{params.applyTimeStart}
</if>
<if test="null != params.applyTimeEnd">
and mpa.apply_time <= #{params.applyTimeEnd}
</if>
可以看到在表达式中是通过xxx.xxx的方式取值的;
先说结论,通过get方法获取的值
org.apache.ibatis.reflection.Reflector#getGetInvoker
mybatis:3.5.10
源码分析
思路大致是先从外层查询进去,然后一路debug进去;
我的查询入口是个分页查询,我在中间源码setParameters处打了个断点
com.baomidou.mybatisplus.core.MybatisParameterHandler#setParameters
然后一路往下跟踪到BeanWrapper中的metaClass.getGetInvoker方法,在其中看到了查询get方法的逻辑
org.apache.ibatis.reflection.wrapper.BeanWrapper#getBeanProperty
获取get方法的逻辑
org.apache.ibatis.reflection.Reflector#getGetInvoker
OGNL的比较优先级源码分析
在OGNL中进行比较时会自动进行类型转换,类型转成一直后才会进行比较;
先说顺序结论
- 如果是同一类型 → 直接比较
- 如果都是
Number→ 数值比较 - 如果可以转换为
Number→ 转换为Number比较 - 否则 → 使用
equals()
在业务中有时会需要传入动态比较符号进行比较;
下面是一个有问题的判断方式;
问题在于其中的 <when test="'=' == compareCondition">进行num转换时会报错;
前面是char后面是string,此时mybatis的ognl会先进行类型比较转换;发现类型不一致,并且不是num,会尝试转成num;
比较入口org.apache.ibatis.ognl.ASTEq#getValueBody
具体类型转换比较org.apache.ibatis.ognl.OgnlOps#isEqual
<choose>
<when test="'&gt;' == compareCondition">
>
</when>
<when test="'&gt;=' == compareCondition">
>=
</when>
<when test="'&lt;' == compareCondition">
<
</when>
<when test="'&lt;=' == compareCondition">
<=
</when>
<when test="'=' == compareCondition">
=
</when>
</choose>
更多推荐




所有评论(0)