文章来源:https://my.oschina.net/u/3844121/blog/1976103
网上的答案没有谈遍历Set集合的,这里来谈谈写法。
版本:我的版本是mabatis-3.4.6,具体哪个版本开始支持Set集合不清楚,3.4.6版本后的都可以这么写。
写法:
(默认在dao层接口里面没有使用Mybatis的@Param注解)
<foreach collection="collection" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
原因:
mybatis的DefaultSqlSession中对dao接口的参数做了封装,体现在这个方法里
private Object wrapCollection(final Object object) {
if (object instanceof Collection) {
StrictMap<Object> map = new StrictMap<>();
map.put("collection", object);
if (object instanceof List) {
map.put("list", object);
}
return map;
} else if (object != null && object.getClass().isArray()) {
StrictMap<Object> map = new StrictMap<>();
map.put("array", object);
return map;
}
return object;
}
其中这一段代码
if (object instanceof Collection) {
StrictMap<Object> map = new StrictMap<>();
map.put("collection", object);
if (object instanceof List) {
map.put("list", object);
}
return map;
}
如果参数Object是个Collection,那么参数会以key为"collection",value为本身的形式存储到map里,这个map就是mapper文件里面的参数来源,而Set继承Collection。
转载请注明出处。