2014-02-13 42 views
1

我有一個用例,其中我想插入一個multimap(例如Multimap)到數據庫中使用mybatis。JAVA | mybatis |插入一個multimap

我不能夠使用下面的訪問鍵和值在MyBatis的: (假設它會調用的entrySet和內部插入之前,它遍歷)

INSERT INTO table1 (integer1, integer2) 
VALUES (#{key} , #{value}) 

不知道如何可以做到這一點? 我假設應該有一個簡單的方法,因爲這是一個基本的用例。

- 編輯 -

雖然我可以創建一個包裝對象,設置這些值,並將其發送到MyBatis的,我想知道是否有任何其他的方式來實現最終的結果不會產生額外的對象,因爲這是我需要他們的唯一地方。

感謝您的幫助。

---編輯--- 合併建議的解決方案後進行測試。對於細節

代碼段:

DAO層:

Map<String, Object> params = new HashMap<>(); 
params.put("entries", myMultimap.entries()); 

MyBatis的SQL:

INSERT INTO table1 
    (integer1, integer2) 
VALUES 
<foreach item="item" separator="," collection="entries"> 
    (#{item.key} , #{item.value}) 
</foreach> 

--- --- EDIT

各位,用上述溶液注意參數長度最多爲2000個字符。如果您遇到問題,配料/批量插入將是進一步進行的方式。

+0

不多重映射包含單個鍵多個值嗎?多個鍵可以具有相同的值。在這種情況下(ManyToMany關係),你不能在一張表中建模。 – Jim

+0

爲什麼不呢,我們可以使用hashmultimap作爲實現,表的鍵應該包含整數1和整數2。然後我們可以插入(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),沒有任何問題。讓我知道如果我失去了一些吉姆。 – crankparty

+0

HashMultimap確保沒有重複的鍵值對。但是一個鍵可以有'1 .. *'值。你可以將它存儲在一張表中,但爲了減少數據庫模型的減少,我建議使用兩個表格:請參閱下面的答案。 – Jim

回答

2

您需要2個表:KEYS和VALUES,其中VALUES應該有一個引用KEYS的外鍵列。例如:

TABLE KEYS: 
| ID | KEY | 
| 1 | key1| 

TABLE VALUES: 
| ID | KEY_ID | VALUE | 
| 1 | 1  | value1| 
| 2 | 1  | value2| 

我們堅持,你需要先堅持在KEYS表中的一個鍵,然後在VALUES表中的相應值的多重映射。讓我知道你是否需要這樣的例子。

編輯:看評論

你應該在MyBatis的使用foreach標籤。在鍵盤或條目上做一個foreach。 像這樣的東西應該工作:

INSERT INTO table1 (integer1, integer2) 
VALUES 
<foreach item="item" seperator="," collection="#{entries}"> 
     (#{item.key)},#{item.value}) 
    </foreach> 

凡參賽作品必須引用MultiMap.Entries()

+0

在我的示例中,integer1已經是另一個表的外鍵,我在這裏看不到使用代理鍵的任何優勢。 – crankparty

+0

啊,說明了很多。那麼的確你應該只需要使用VALUES並且省略ID列。您需要遍歷每個鍵的值並插入該鍵值對。 – Jim

+0

的確如此,爲此,我想知道是否可以將整個地圖傳遞給mybatis,並讓它處理迭代並插入每個鍵 - 值對 – crankparty