第一次的配置java
<trim prefix=" tags =case" suffix="end"> <foreach collection="_parameter.keys" item="item" index="i"> when (order_id=#{item}) then #{_parameter[item]} </foreach> </trim>
_parameter
因为我没有指定参数名,因此myBatis默认是使用这个作为参数的。mybatis
首先使用_parameter.keys
能够拿到全部的key,item这里就是key的值,取key的值能够直接用#{item}
,获取value不能直接用#{_parameter[item]}
,可是最后发现这样解析不到map对象?app
具体可参考BaseWrapper的resolveCollection方法code
protected Object resolveCollection(PropertyTokenizer prop, Object object) { if ("".equals(prop.getName())) { return object; } else { return metaObject.getValue(prop.getName()); } }
由于传了_parameter以后,它会当成属性到map中去找,因此找不到,因此我又尝试了使用#{[item]},这样是能够拿到map对象,可是里面的[item]整个被当成了key,并无被解析,因此我又换成了下面这种方式,就是把#换成$,试验成功。xml
<trim prefix=" tags =case" suffix="end"> <foreach collection="_parameter.keys" item="item" index="i"> when (order_id=#{item}) then ${[item]} </foreach> </trim>
为何这两种方式差异这么大呢?这个应该是$和#的解析方式有关,那咱们是否是还有其它方式解析成功呢,我又试了另外几种对象
<trim prefix=" tags =case" suffix="end"> <foreach collection="_parameter.keys" item="item" index="i"> when (order_id=#{item}) then ${_parameter[item]} </foreach> </trim>
<trim prefix=" tags =case" suffix="end"> <foreach collection="_parameter.keys" item="item" index="i"> when (order_id=#{item}) then #{_parameter[${item}]} </foreach> </trim>
<trim prefix=" tags =case" suffix="end"> <foreach collection="_parameter.keys" item="item" index="i"> when (order_id=#{item}) then #{[${item}]} </foreach> </trim>
<trim prefix=" tags =case" suffix="end"> <foreach collection="_parameter.entrySet()" item="value" index="key"> when (order_id=#{key}) then #{value} </foreach> </trim>
毫无疑问使用第四种方式是最直接明了的,容易理解字符串
前面的几种获取方式,主要问题应该是在表达式内部,myBatis把[]
当成了字符串,因此用[item]
也解析不了,使用#{[${item}]}
以后,就能够解析成功了。get