2013-02-11 109 views
1

我想知道在弹簧集成中使用mybatis时,变换方法参数的最佳方法是什么。转换的原因可能是由于各种原因 - 例如, mybatis无法处理java.util.Set作为参数输入。Mybatis弹簧变换参数

具体,说我有一个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转变成List<Long> ids的MyBatis的XML片段可以解释。我明白我们可以给出一个直接处理SqlSessionFactory的具体类,但我喜欢Spring集成提供的抽象,我不担心获取会话和关闭它们等非有趣的东西。

有人可能会认为DAO应该是愚蠢的,可能应该在服务层进行转换。然而,这种情况下的转换是因为mapper框架的细微差别,服务层做了一些抵消它的工作似乎不正确。

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

回答

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

0

你可以看看MyBatis typeHandlers。 创建你自己的类型处理程序并在你的parameterMap中定义它 - 这可以做一个窍门。

的MyBatis只接受列表和数组类型的foreach语句:

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