我们使用mybatis 3.1.1。
我们发现oracle返回的结果映射包含大写字母的列名,而在mySql的情况下,返回的结果映射包含小写字母的列名。
我的问题是:我是否有办法编写某种拦截器,以便我可以修改结果图返回的结果。
感谢。
答案 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.AbstractMap
或java.util.HashMap
扩展的LowerCaseMap类,并将所有调用包装到put
,putAll
和/或{{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>