myBatis中使用Map進行遍歷
阿新 • • 發佈:2018-12-20
myBatis中使用Map獲取key, value的方式
第一次的配置
<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預設是使用這個做為引數的。
首先使用_parameter.keys
#{item}
,獲取value不能直接用#{_parameter[item]}
,但是最後發現這樣解析不到map物件?
具體可參考BaseWrapper的resolveCollection方法
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,並沒有被解析,所以我又換成了下面這種方式,就是把#換成$,試驗成功。
<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>
- 使用map.entrySet直接獲取key, value
<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}]}
之後,就可以解析成功了。