2012-07-30 57 views
1

我們使用mybatis 3.1.1。mybatis- 3.1.1。如何覆蓋從mybatis返回的結果圖

我們發現甲骨文的結果地圖返回包含列名稱以大寫字母在MySQL的情況下,結果地圖返回包含小寫字母列名。

我的問題是:有什麼辦法可以寫一些類型的攔截器,這樣我可以修改結果地圖返回結果。

謝謝。

回答

3

恐怕答案是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.AbstractMapjava.util.HashMap和包裝所有的呼叫,putputAll和/或get永遠是小寫一個LowerCaseMap類。然後指定在填充查詢中的數據時,MyBatis應該使用特定的LowerCaseMap而不是標準的HashMap。

如果你喜歡這個想法,並希望在如何告訴MyBatis如何使用不同的具體集合類,見我回答這個StackOverflow的問題幫助:https://stackoverflow.com/a/11596014/871012

+0

我在想,可能會有一些辦法可以改變API的代碼,但最終我選擇了第二個選項。 – 2012-08-03 01:44:28

0

如果修改查詢以便獲取所需的確切列名,該怎麼辦?例如:

select my_column as MY_COLUMN from ... 
+0

對於每個查詢手動修改它將是一項非常繁瑣的任務。有很多從mybatis發起的select查詢。有什麼方法可以用一些攔截器來做到嗎? – 2012-07-30 11:58:06

+0

我想無論是小寫,但在Oracle它總是現身是在帽 – 2012-07-30 12:11:45

0

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