mybatis- 3.1.1。如何覆盖从mybatis返回的resultmap

时间:2012-07-30 11:44:12

标签: ibatis mybatis

我们使用mybatis 3.1.1。

我们发现oracle返回的结果映射包含大写字母的列名,而在mySql的情况下,返回的结果映射包含小写字母的列名。

我的问题是:我是否有办法编写某种拦截器,以便我可以修改结果图返回的结果。

感谢。

3 个答案:

答案 0 :(得分:3)

我担心答案是MyBatis没有提供任何直接的方法来控制结果图中键的大小写。我最近在MyBatis Google小组上提出了这个问题:https://groups.google.com/forum/?fromgroups#!topic/mybatis-user/tETs_JiugNE

结果取决于JBDC驱动程序的行为。

事实证明,@ jddsantaella建议的列别名在所有情况下都不起作用。我过去用三个数据库测试了MyBatis-3.1.1:MySQL,PostgreSQL和H2,得到了不同的答案。对于MySQL,列别名的情况确实决定了hashmap中键的大小写。但是对于PostgreSQL,它总是小写的,而对于H2,它总是大写的。我没有测试列别名是否适用于Oracle,但默认情况下它似乎返回大写字母。

我看到两个选项

选项1 :创建一些帮助器方法,代码将始终使用该方法将数据从返回的映射中提取出来。例如:

private Object getFromMap(Map<String, Object> map, String key) {
  if (map.containsKey(key.toLowerCase())) {
    return map.get(key.toLowerCase());
  } else {
    return map.get(key.toUpperCase());
  }
}


选项2:编写一个从java.util.AbstractMapjava.util.HashMap扩展的LowerCaseMap类,并将所有调用包装到putputAll和/或{{1永远是小写的。然后在填充查询中的数据时指定MyBatis应该使用特定的LowerCaseMap而不是标准的HashMap。

如果您喜欢这个想法,并希望获得有关如何告诉MyBatis如何使用其他具体集合类的帮助,请参阅我对此StackOverflow问题的回答:https://stackoverflow.com/a/11596014/871012

答案 1 :(得分:0)

如果您修改查询以获得所需的确切列名,该怎么办?例如:

select my_column as MY_COLUMN from ...

答案 2 :(得分:0)

作为ResultType的LowerCaseMap的想法是合理的,但你可以避免编写自己的。就我而言,我正在使用org.apache.commons.collections.map.CaseInsensitiveMap

<select id="getTableValues" 
        resultType="org.apache.commons.collections.map.CaseInsensitiveMap">
      SELECT *
        FROM my_table
       WHERE seq_val=#{seq_val}
</select>