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

相关文章
相关标签/搜索