MyBatis迭代器
目录:
- [简介][1]
- [MyBatis迭代的几种方式][2]
- [总结][3]
- [参考资料][4]
1.简介
MyBatis迭代器用于设置SQL
中in的条件。即: select * from User where pk in (...)
中in的条件。MyBatis中的迭代器格式如下:
<foreach item="item" collection="<collectionName>" index="index" open="(" separator="," close=")">
#{item}
</foreach>
collection : 用于迭代的集合名字
index:集合中的元素
index:迭代时的当前元素位置
open:开始符号
separator : 分隔符
close : 结束符号
2.MyBatis迭代的几种方式
参数:java.util.Collection
集合类型
public List<User> getUserByIds(List<String> id);
<select id="getUserByIds" resultType="...User">
select * from User where pk in
<foreach item="item" collection="list" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</select>
参数: 数组类型
public List<User> getUserByIds(String[] id);
<select id="getUserByIds" resultType="...User">
select * from User where pk in
<foreach item="item" collection="array" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</select>
参数:多个
这种情况下使用Map
,将集合以key-value的格式放到Map中,然后在xml中获取名字即可。实际上MyBatis就是将接口中的参数以名字(@Param(""))和其对应的值放到Map中的,所以可以在xml/SelectProvider从Map中获取参数值从而达到动态SQL。
Map<String,Object> map = Maps.newHashMap("ids",Lists.newArrayList());
public void addUser(Map<String,Object) map);
<select id="getUserByIds" resultType="...User">
select * from User where pk in
<foreach item="item" collection="ids" index="index" open="(" separator="," close=")">
#{item}
</foreach>
</select>
3.总结
MyBatis对参数的包装使用Map
这个思想很重要。
例如:
@SelectProvider(type=MyProvider.class,method="insertUser")
public void addUser(@Param("ids") List<String> ids, @Param("name")String name, @Param("age") int age);
其中addUser
的方法参数会被包装为Map:{"ids":[] , "name的值": "" , "age": "age的值"}。
在SelectProvider中可以获得参数
public class MyProvider extends SQLBuilder{
public String insertUser(Map<String,Object> params){
BEGIN();
String name =(String) params.get("name");
int age = (int)params.get("age");
// 根据业务逻辑拼装SQL
return SQL();
}
}