我们使用 mybatis 3.1.1。
我们发现对于 oracle,返回的结果映射包含大写字母的列名,而在 mySql 的情况下,返回的结果映射包含小写字母的列名。
我的问题是:有什么方法可以编写某种拦截器,以便我可以修改结果映射返回的结果。
谢谢。
恐怕答案是 MyBatis 没有提供任何直接的方法来控制结果映射中键的大小写。我最近在 MyBatis Google Group 上问了这个问题: 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
编写一个从or扩展的 LowerCaseMap 类,java.util.HashMap
并包装所有对 和/或 的调用put
,putAll
并且/或get
始终为小写。然后指定 MyBatis 在从查询中填充数据时应该使用您特定的 LowerCaseMap 而不是标准的 HashMap。
如果你喜欢这个想法并想知道如何告诉 MyBatis 如何使用不同的具体集合类,请参阅我对这个 StackOverflow 问题的回答:https ://stackoverflow.com/a/11596014/871012
如果您修改查询以获得所需的确切列名怎么办?例如:
select my_column as MY_COLUMN from ...
将 LowerCaseMap 作为 ResultType 的想法是合理的,但您可以避免自己编写。就我而言,我使用的是org.apache.commons.collections4.map.CaseInsensitiveMap:
<select id="getTableValues"
resultType="org.apache.commons.collections.map.CaseInsensitiveMap">
SELECT *
FROM my_table
WHERE seq_val=#{seq_val}
</select>