ibatis缓存select字段

如何解决动态数据表名,动态字段名情况下,由ibatis缓存select字段而引起的 字段找不到的情况?以下是最简单的解决办法! 当使用动态表,动态字段时,会引起字段名的缓存,以下是解决办法。 先看一个例子。下面是段SQL语句

<!-- 根据查询条件从类推数据表中查询数据 -->   
 <select id="select_resData_bycondition" parameterClass="java.util.HashMap"  resultClass="java.util.HashMap" remapResults="true" >   
 select $fieldnames$ from $resourcetable$ where 1=1   
 <include refid="select_data_by_condition" />  
 </select> 

前台传入的hashmap变量中,有动态数据表名,及字段名, Dao里面的调用方法如下:
//根据动态数据表名及动态选择的字段按条件分页查出相应的数据,注意清除缓存的使用

public void getResDataByCondition(Page page) {   
    // TODO Auto-generated method stub        
    super.queryForListPagination("select_resData_bycondition", page);        
}   

父类的queryForListPagination
如下:其中page这个变量是对dataset进行一些封装,对查询条件封装。

public void  queryForListPagination(String statementName,Page page)
{      ….略           }  

由于多个菜单会调用到这个dao中的getResDataByCondition方法,也就去调用 Id为select_resData_bycondition的select语句,由于ibatis的缓存机制, 当第一次调用这个select语句时,会将字段查询出来,放入缓存中,比如第一个表 是user人员表,有字段gh,name,gz等字段,则第二次调用时,前台传入了表名是 Dwbm部门表,有字段bmbm,bmmc等,看了ibatis的源码,知道 ibaits中缓存列名的地方在这里:

 com.ibatis.sqlmap.engine.mapping.result .AutoResultMap    
 public synchronized Object[] getResults(StatementScope statementScope, ResultSet rs) 
      throws SQLException {      
      if (allowRemapping || getResultMappings() == null) {       
      initialize(rs);     
      }      
      return super.getResults(statementScope, rs);   
}  

所以第二次形成的正确SQL语句应该是select bmbm,bmmc from Dwbm where 条件… 如果这样,当然能找到适合的数据,不过由于以上所述缓存机制的存在,使得 在执行第二个动态查询时,实际上先将上一次查询出来的字段名放在缓存中, 即gh,name,gz 这时取出来,形成了实际的SQL语句 Select gh,name,gz from dwbm where 条件 这样当然就不正确了!

最简单的解决办法是在各SQL语句的书写中,加上remapResults=”true” 如上面的id为”select_resData_bycondition”的语句, 这样就强制每次根据前台传进的动态数据表名,和动态字段名, 重新去映射字段,而不再使用上一次的字段列表,这样当然就正确了! 再不会出现某字段找不到的情况!这是最简单的办法!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值