MyBatis 使用 foreach 标签构造 MySQL in 语句
<foreach>
常见元素的属性
- collection :要迭代的列表或数组。
- item :迭代中使用的变量。
- index :是当前迭代的序号(针对 map, index 是键,item 是值)。
- open :在开头添加的字符串。
- separator :迭代之间插入的分隔符。
- close :在结尾添加的字符串。
参数类型为 String
参数类型是通过分割符拼接起来的数据列表,例如:
java :
// 参数示例
String idStr = "2,3,4";
public List<City> selectCityByIdStr(String idStr);
xml :
<select id="selectCityByIdStr" resultMap="CityResult">
select * from city
where id in
<foreach collection="idStr.split(',')" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
使用 MyBatis 的 foreach 标签来拼装 in 语句,所以要将字符串类型的 id 列表转换为可遍历的 collection 。这里使用 split 将 String 类型的 id 列表转换为数组。
参数类型为 Map
java :
// 参数示例
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("cityName", "test");
dataMap.put("idArr", new Long[]{2L, 3L, 4L});
public List<City> selectCityByIdMap(Map dataMap);
xml :
<select id="selectCityByIdMap" resultMap="CityResult">
select * from city
where id in
<foreach collection="idArr" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
注意 Map 中有多个参数,所以 foreach 标签中的 collection 属性需要指明遍历的集合是 Map 中的 idArr。
参数类型为 List
java :
public List<City> selectCityByIdList(List<Long> idList);
xml :
<select id="selectCityByIdList" resultMap="CityResult">
select * from city
where id in
<foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
参数类型为 Array
java :
public List<City> selectCityByIdArr(Long [] idArr);
xml :
<select id="selectCityByIdArr" resultMap="CityResult">
select * from city
where id in
<foreach collection="array" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
总结
我的查询接口的参数类型是由逗号分隔的 id 拼接字符串,想要使用 foreach 标签的话需要将 id 列表转换为可遍历的 collection,字符串类型的数据可使用 split 来转为数组。
在使用 MyBatis 的 foreach 时,当只有一个参数时 collection 可根据参数类型写为 array 或 list, 但当有多个参数时 collection 需要写待遍历的参数名称。