1

我想知道在使用 mybatis 和 spring 集成时转换方法参数的最佳方法是什么。转换的原因可能有多种原因 - 例如 mybatis 无法将 java.util.Set 处理为参数输入。

具体来说,假设我有一个 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> idsList<Long> idsmybatis XML 片段可以解释的方法。我知道我们可以提供一个直接处理 SqlSessionFactory 的具体类,但我喜欢 Spring 集成提供的抽象,我不担心获取会话和关闭它们等无趣的东西。

有人可能还会争辩说 DAO 应该是愚蠢的,并且可能转换应该发生在服务层。但是,这种情况下的转换是由于映射器框架的细微差别,服务层采取了一些措施来抵消它,这似乎是不正确的。

欢迎提出建议并提前致谢!

4

2 回答 2

1

这里的具体示例可以通过@Param 提供参数名称(而不是假设它是“列表”)并在 XML 中使用该参数名称来解决。

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

于 2013-02-25T05:04:37.303 回答
0

你可以看看 MyBatis typeHandlers。创建您自己的类型处理程序并在您的 parameterMap 中定义它 - 这可以起到作用。

MyBatis 在 foreach 语句中只接受 List 和 Array 类型:

您可以将 List 实例或 Array 作为参数对象传递给 MyBatis。当你这样做时,MyBatis 会自动将它包装在一个 Map 中,并按名称键入它。列表实例将被键入名称“list”,数组实例将被键入名称“array”。

于 2013-02-14T14:59:58.580 回答