1

我们使用 mybatis 3.1.1。

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

我的问题是:有什么方法可以编写某种拦截器,以便我可以修改结果映射返回的结果。

谢谢。

4

3 回答 3

4

恐怕答案是 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并包装所有对 和/或 的调用putputAll并且/或get始终为小写。然后指定 MyBatis 在从查询中填充数据时应该使用您特定的 LowerCaseMap 而不是标准的 HashMap。

如果你喜欢这个想法并想知道如何告诉 MyBatis 如何使用不同的具体集合类,请参阅我对这个 StackOverflow 问题的回答:https ://stackoverflow.com/a/11596014/871012

于 2012-07-31T03:30:13.697 回答
0

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

select my_column as MY_COLUMN from ...
于 2012-07-30T11:49:01.303 回答
0

将 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>
于 2013-02-13T19:31:41.387 回答