zoukankan      html  css  js  c++  java
  • myBatis中使用Map进行遍历

    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可以拿到所有的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>
    

    为什么这两种方式差别这么大呢?这个应该是$和#的解析方式有关,那我们是不是还有其它方式解析成功呢,我又试了另外几种

    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}]}之后,就可以解析成功了。

  • 相关阅读:
    HDU 3415 Max Sum of Max-K-sub-sequence 最长K子段和
    Android Fragment 真正彻底的解决(下一个)
    【数据分析面试题】一个 面试题,我的回答
    Swift初体验(两)
    MyEclipse10.0 集成 SVN
    CFileDialog 打开文件夹文件 保存文件夹文件
    基于thinkphp的uploadify上传图功能
    近20家银行手机银行签名被非法滥用风险分析
    设计模式【6】:适配器模式【接口适配】
    【学习笔记】编译原理-有限自己主动机
  • 原文地址:https://www.cnblogs.com/yissheng/p/9927519.html
Copyright © 2011-2022 走看看