myBatis中使用Map進行遍歷

myBatis中使用Map獲取key, value的方式

第一次的配置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>

爲何這兩種方式差異這麼大呢?這個應該是$和#的解析方式有關,那咱們是否是還有其它方式解析成功呢,我又試了另外幾種對象

  1. 能夠解析成功
<trim prefix=" tags =case" suffix="end">
   <foreach collection="_parameter.keys" item="item"  index="i">
         when (order_id=#{item}) then ${_parameter[item]}
   </foreach>
</trim>
  1. 不能解析成功,這裏我想主要是因爲我沒有使用自定義的參數,因爲在外部指定了集合的名稱,這種方式應該也是能夠的。
<trim prefix=" tags =case" suffix="end">
   <foreach collection="_parameter.keys" item="item"  index="i">
         when (order_id=#{item}) then #{_parameter[${item}]}
   </foreach>
</trim>
  1. 能夠解析成功
<trim prefix=" tags =case" suffix="end">
   <foreach collection="_parameter.keys" item="item"  index="i">
         when (order_id=#{item}) then #{[${item}]}
   </foreach>
</trim>
  1. 使用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}]}以後,就能夠解析成功了。get

相關文章
相關標籤/搜索