我们使用mybatis 3.1.1。mybatis- 3.1.1。如何覆盖从mybatis返回的结果图
我们发现甲骨文的结果地图返回包含列名称以大写字母在MySQL的情况下,结果地图返回包含小写字母列名。
我的问题是:有什么办法可以写一些类型的拦截器,这样我可以修改结果地图返回结果。
谢谢。
我们使用mybatis 3.1.1。mybatis- 3.1.1。如何覆盖从mybatis返回的结果图
我们发现甲骨文的结果地图返回包含列名称以大写字母在MySQL的情况下,结果地图返回包含小写字母列名。
我的问题是:有什么办法可以写一些类型的拦截器,这样我可以修改结果地图返回结果。
谢谢。
恐怕答案是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.AbstractMap
或java.util.HashMap
和包装所有的呼叫,put
,putAll
和/或get
永远是小写一个LowerCaseMap类。然后指定在填充查询中的数据时,MyBatis应该使用特定的LowerCaseMap而不是标准的HashMap。
如果你喜欢这个想法,并希望在如何告诉MyBatis如何使用不同的具体集合类,见我回答这个StackOverflow的问题帮助:https://stackoverflow.com/a/11596014/871012
如果修改查询以便获取所需的确切列名,该怎么办?例如:
select my_column as MY_COLUMN from ...
对于每个查询手动修改它将是一项非常繁琐的任务。有很多从mybatis发起的select查询。有什么方法可以用一些拦截器来做到吗? – 2012-07-30 11:58:06
我想无论是小写,但在Oracle它总是现身是在帽 – 2012-07-30 12:11:45
一个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>
我在想,可能会有一些办法可以改变API的代码,但最终我选择了第二个选项。 – 2012-08-03 01:44:28