mybatis- 3.1.1。 如何覆盖从MyBatis的返回结果映射(mybatis- 3.1

2019-06-26 15:32发布

我们使用的MyBatis 3.1.1。

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

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

谢谢。

Answer 1:

恐怕答案是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,它始终是大写的。 我没有测试列别名是否将与甲骨文合作,但默认情况下它似乎返回大写字母。

我看到两个选项

选项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:写LowerCaseMap类从扩展java.util.AbstractMapjava.util.HashMap和包装所有的呼叫, putputAll和/或get永远是小写。 然后,指定MyBatis的应使用特定LowerCaseMap而不是一个标准的HashMap,填充从查询数据时。

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



Answer 2:

如果你修改什么查询,所以你得到你需要的正是列名? 例如:

select my_column as MY_COLUMN from ...


Answer 3:

一个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>


文章来源: mybatis- 3.1.1. how to override the resultmap returned from mybatis