我有一个用例,其中我想使用mybatis将多图(例如Multimap)插入数据库。
我无法使用以下方法访问mybatis中的键和值: (假设它会调用entrySet并在插入之前在内部迭代)
INSERT INTO table1 (integer1, integer2)
VALUES (#{key} , #{value})
知道如何做到这一点? 我假设应该有一个简单的方法,因为这是一个基本的用例。
- 编辑 -
虽然我可以创建一个包装器对象,设置这些值并将它们发送到mybatis,我想知道是否有其他方法可以实现最终结果而不创建其他对象,因为这是我需要它们的唯一地方
感谢您的帮助。
--- --- EDIT 在纳入建议的解决方案后进行测试。
详细信息的代码段:
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>
---编辑---
Guys,使用上述解决方案,请注意参数长度最多为2000个字符。如果您遇到问题,批量/批量插入将是继续进行的方式。
答案 0 :(得分: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()