2012-07-30 79 views
1

我们使用mybatis 3.1.1。mybatis- 3.1.1。如何覆盖从mybatis返回的结果图

我们发现甲骨文的结果地图返回包含列名称以大写字母在MySQL的情况下,结果地图返回包含小写字母列名。

我的问题是:有什么办法可以写一些类型的拦截器,这样我可以修改结果地图返回结果。

谢谢。

回答

3

恐怕答案是MyBatis的不提供控制结果地图键的情况下,任何直接的方式。最近,我问这个问题上MyBatis的谷歌组: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和包装所有的呼叫,putputAll和/或get永远是小写一个LowerCaseMap类。然后指定在填充查询中的数据时,MyBatis应该使用特定的LowerCaseMap而不是标准的HashMap。

如果你喜欢这个想法,并希望在如何告诉MyBatis如何使用不同的具体集合类,见我回答这个StackOverflow的问题帮助:https://stackoverflow.com/a/11596014/871012

+0

我在想,可能会有一些办法可以改变API的代码,但最终我选择了第二个选项。 – 2012-08-03 01:44:28

0

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

select my_column as MY_COLUMN from ... 
+0

对于每个查询手动修改它将是一项非常繁琐的任务。有很多从mybatis发起的select查询。有什么方法可以用一些拦截器来做到吗? – 2012-07-30 11:58:06

+0

我想无论是小写,但在Oracle它总是现身是在帽 – 2012-07-30 12:11:45

0

一个LowerCaseMap的理念为与resultType是健全的,但你可以避免写自己的。在我的情况下,我使用的是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>