sqlmap.xml:<mapper namespace="SelectCache" >  
  
    <cache type="org.mybatis.caches.ehcache.LoggingEhcache" />  
        
    <resultMap type="User" id="userResultMap">  
        ...    
    </resultMap>  
       
    
    <!-- call procedure parameter -->
    <parameterMap id="parameterMap" type="java.util.HashMap">
        <parameter property="IN_TesterCode" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
        <parameter property="IN_PassWord" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
        <parameter property="result" jdbcType="CURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="userResultMap"/>
    </parameterMap>
     
<select id="getTesterByCodeAndPwd"  parameterMap="parameterMap" statementType="CALLABLE" resultType="User">
        {call pkg_gettesterbycodeandpwd.proc_gettesterbycodeandpwd(?, ?,?)}
    </select>
</mapper> java code:List userList = null;
Map<String, Object> param = new HashMap<String, Object>(); 

param.put("IN_TesterCode", getUser().getTesterCode()); 
param.put("IN_PassWord", getUser().getPassWord()); 
param.put("result", userList); // 调用存储过程
userServices.getTesterByCodeAndPwd(param);userList= (ArrayList)param.get("result");    // 得到存储过程返回的List第一次调用userList可用,在缓存没有失效时再次调用,userList为null,郁闷,我知道是缓存的事,但不知道怎么解决,望各位大侠多帮忙,谢谢!!!

解决方案 »

  1.   

    你这个函数:userServices.getTesterByCodeAndPwd(param) 是怎么定义的?你检查了它的返回值么?
      

  2.   

    返回值是通过userList= (ArrayList)param.get("result"); // 得到存储过程返回的List得到的,是存储过程返回记录集,如果不使用缓存的话,userList每次都可以拿到值,使用缓存后,如果执行了向数据层拿数据后,再执行同样语句后,因为缓存原因,不执行查询语句,但userList从缓存中取不到值。望继续关注,非常感谢!!!!
      

  3.   

    方便的话,把userServices.getTesterByCodeAndPwd()内容贴出来吧。
      

  4.   

    public List<User> getTesterByCodeAndPwd(Map<String, Object> parameterMap){
    return serviceUserDao.getTesterByCodeAndPwd(parameterMap);
    }
    <!-- 调用存储过程 getTesterByCodeAndPwd-->
      <parameterMap id="parameterMap" type="java.util.HashMap">
      <parameter property="IN_TesterCode" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
      <parameter property="IN_PassWord" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
      <parameter property="result" jdbcType="CURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="userResultMap"/>
      </parameterMap>
        
    <select id="getTesterByCodeAndPwd" parameterMap="parameterMap" statementType="CALLABLE" resultType="User">
      {call pkg_gettesterbycodeandpwd.proc_gettesterbycodeandpwd(?, ?,?)}
      </select>
    </mapper>返回值是从param.get("result")中取得的,非常感谢
      

  5.   

    如果我把存储过程换成普通的Sql语句,一起就正常了,非常郁闷!
      

  6.   

    嗯,我认为缓存的结果并没有更新到parameterMap中,但应该已经return回来了,你可以检查下。public List<User> getTesterByCodeAndPwd(Map<String, Object> parameterMap){
      List<User> userList = serviceUserDao.getTesterByCodeAndPwd(parameterMap);
      parameterMap.put("result", userList); 
      return parameterMap;
    }原因应该是存储过程没有被执行,所以也不存在输出参数这个概念了,能用的只有返回值。楼主试试看吧。
      

  7.   

    非常感谢ldh911,但是List<User> userList = serviceUserDao.getTesterByCodeAndPwd(parameterMap);的返回值为空,所要的结果在parameterMap的result的key中,所以上面的写法也不行。
      

  8.   

    那么再检查serviceUserDao.getTesterByCodeAndPwd()里面吧。没道理别人都能用的好好的,到你这里就死活没得玩了。
      

  9.   

    serviceUserDao只是一个接口,没有实现类,通过接口之间调用splmap.xml中对应的<select id="getTesterByCodeAndPwd"  parameterMap="parameterMap" statementType="CALLABLE" resultType="User">
            {call pkg_gettesterbycodeandpwd.proc_gettesterbycodeandpwd(?, ?,?)}
        </select>方法。还是非常感谢ldh911!!!!!
      

  10.   

    所以我怀疑还是
    <!-- 调用存储过程 getTesterByCodeAndPwd-->
      <parameterMap id="parameterMap" type="java.util.HashMap">
      <parameter property="IN_TesterCode" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
      <parameter property="IN_PassWord" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
      <parameter property="result" jdbcType="CURSOR" javaType="java.sql.ResultSet" mode="OUT" resultMap="userResultMap"/>
      </parameterMap>
        
    <select id="getTesterByCodeAndPwd" parameterMap="parameterMap" statementType="CALLABLE" resultType="User">
      {call pkg_gettesterbycodeandpwd.proc_gettesterbycodeandpwd(?, ?,?)}
      </select>
    这个配置有问题。
      

  11.   

    我看了mybatis的部分查询代码,调用存储过程是返回一个LIst,而且缓存也保存这个List,这是还没有看前台Xml配置部分的代码,比较郁闷,如果Mybatis只要这一种存储过程调用方式,那么是不是就和缓存有冲突!!!
      

  12.   

    原来是这样,你可能不能用select来定义,要用procedure,类似于:<procedure id="getTesterByCodeAndPwd" parameterMap="parameterMap">  
    call pkg_gettesterbycodeandpwd.proc_gettesterbycodeandpwd (#is_audit_option#,#is_staff_id#,#on_errsys#,#os_syserrtext#,#os_syserrtext#)  
    </procedure>
      

  13.   

    <procedure 使用这个编译都过不去。   还是非常感谢ldh911
      

  14.   

    我怀疑还是存储过程的事,如果换成sqlserver我想肯定能行,就可用通过如下方式得到纪录集:List<User> userList = serviceUserDao.getTesterByCodeAndPwd(parameterMap);
    而oracle存储过程是通过返回参数实现的只能通过如下方式得到记录集:
    serviceUserDao.getTesterByCodeAndPwd(parameterMap);   // 调用存储过程
    List<User> userList=(List<User>)parameterMap.get("result");  // 从Map中得到返回值,而缓存是不记录Map的,郁闷。oracle有像sqlserver那样直接返回记录集的吗?