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


摘自:https://www.cnblogs.com/yissheng/p/9927519.html

 

第一次的配置

<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可以拿到所有的key,item這里就是key的值,取key的值可以直接用#{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}]}之后,就可以解析成功了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM