JAVA | mybatis |插入多重映射

JAVA | mybatis |插入多重映射,java,insert,mybatis,Java,Insert,Mybatis,我有一个用例,我想使用mybatis将一个多重映射(例如多重映射)插入数据库 我无法通过以下方式访问mybatis中的密钥和值: (假设它将调用entrySet并在插入之前在其内部进行迭代) 你知道怎么做吗? 我假设应该有一个简单的方法,因为这是一个基本的用例 --编辑-- 虽然我可以创建一个包装器对象,设置这些值并将它们发送给mybatis,但我想知道是否有其他方法可以在不创建其他对象的情况下实现最终结果,因为这是我唯一需要它们的地方 谢谢你的帮助 ---编辑--- 在加入建议的溶液后进行测试

我有一个用例,我想使用mybatis将一个多重映射(例如多重映射)插入数据库

我无法通过以下方式访问mybatis中的密钥和值: (假设它将调用entrySet并在插入之前在其内部进行迭代)

你知道怎么做吗? 我假设应该有一个简单的方法,因为这是一个基本的用例

--编辑--

虽然我可以创建一个包装器对象,设置这些值并将它们发送给mybatis,但我想知道是否有其他方法可以在不创建其他对象的情况下实现最终结果,因为这是我唯一需要它们的地方

谢谢你的帮助

---编辑--- 在加入建议的溶液后进行测试

有关详细信息,请参阅代码段:

DAO层:

Map<String, Object> params = new HashMap<>();
params.put("entries", myMultimap.entries());
Map params=newhashmap();
参数put(“entries”,myMultimap.entries());
Mybatis sql:

INSERT INTO table1
    (integer1, integer2)
VALUES
<foreach item="item" separator="," collection="entries">
   ( #{item.key} , #{item.value} )
</foreach>
插入到表1中
(整数1,整数2)
价值观
(#{item.key},#{item.value})
---编辑---


伙计们,使用上述解决方案,请注意参数长度最多为2000个字符。如果您面临这个问题,批处理/批量插入将是进一步处理的方式。

您需要两个表:键和值,其中值应具有引用键的外键列。例如:

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

TABLE VALUES:
| ID | KEY_ID | VALUE |
| 1  | 1      | value1|
| 2  | 1      | value2|
现在,要持久化多重映射,您需要首先在KEYS表中持久化a键,然后在values表中持久化相应的值。如果你需要一个例子,请告诉我

编辑:参见评论

您应该在mybatis中使用foreach标记。对键集或条目执行foreach。 像这样的方法应该会奏效:

INSERT INTO table1 (integer1, integer2)
VALUES 
<foreach item="item" seperator="," collection="#{entries}">
       ( #{item.key)},#{item.value})
    </foreach>
插入表1(整数1、整数2)
价值观
(#{item.key)},#{item.value})

其中条目应该引用MultiMap。entries()

MultiMap不是为一个键包含多个值吗?多个关键点可以具有相同的值。在这种情况下(多个关系),您不能仅在一个表中对其建模。为什么不呢,我们可以使用hashmultimap作为实现,表的键应该同时包含integer1和integer2。然后我们可以插入(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),没有任何问题。如果我遗漏了什么,请告诉我Jim。HashMultimap确保没有重复的键值对。但是单个键可以有
1..*
值。您可以将其存储在一个表中,但为了减少数据库模型中的冗余,我建议使用两个表:见下面的答案。在我的示例中,integer1已经是另一个表的外键,我不认为在这里使用代理键有任何好处。啊,这解释了很多。实际上,您应该只需要使用可编辑的值,并省略ID列。您需要循环每个键的值并插入该键值对。确实如此,因此,我想知道是否可以将整个映射传递给mybatis,并让它负责迭代和插入每个键值对,以获得帮助。我已经用测试过的解决方案更新了这个问题。
INSERT INTO table1 (integer1, integer2)
VALUES 
<foreach item="item" seperator="," collection="#{entries}">
       ( #{item.key)},#{item.value})
    </foreach>