我想知道在使用mybatis和spring集成时转换方法参数的最佳方法是什么。改造的原因可能是出于各种原因 - 例如mybatis无法将java.util.Set作为param输入处理。
具体地说,我有一个DAO接口方法:
List<Foo> getFooForUniqueIds(Set<Long> ids);
和相应的XML:
<select id="getFooForUniqueIds" parameterType="java.util.Set" resultMap="foo">
SELECT f.*
FROM foo f
WHERE f.id IN <foreach collection="list" item="item" separator="," close=")" open="(">
#{item}
</foreach>
</select>
我需要一种方法将Set<Long> ids
转换为mybatis XML片段可以解释的List<Long> ids
。我知道我们可以给出一个直接处理SqlSessionFactory的具体类,但是我喜欢Spring集成提供的抽象,我不担心非常有趣的东西,如获取会话和关闭它们。
有人可能会认为DAO应该是愚蠢的,可能转型应该发生在服务层。然而,在这种情况下的转换是因为映射器框架的细微差别和服务层做某事来抵消它似乎是不正确的。
提前建议和感谢!
答案 0 :(得分:1)
这里的具体示例可以通过@Param提供一个param名称来解决(而不是假设它是“list”)并在XML中使用该param名称。
List<Foo> getFooForUniqueIds(@Param("set") Set<Long> ids);
将XML作为
<select id="getFooForUniqueIds" parameterType="java.util.Set" resultMap="foo">
SELECT f.*
FROM foo f
WHERE f.id IN <foreach collection="set" item="item" separator="," close=")" open="(">
#{item}
</foreach>
</select>
参考: https://groups.google.com/forum/?fromgroups=#!topic/mybatis-user/BGjvVw1xx_c
答案 1 :(得分:0)
您可以查看MyBatis typeHandlers。 创建自己的类型处理程序并在parameterMap中定义它 - 这可以解决问题。
MyBatis只接受foreach语句中的List和Array类型:
您可以将List实例或数组作为参数传递给MyBatis 宾语。当你这样做时,MyBatis会自动将它包装在Map中,并且 按名称键入。列表实例将键入名称“列表”和 数组实例将键入名称“array”。