AceElf - 拙杰

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 需要写待遍历的参数名称。


Copyright © 2023-2024 aceelf.com. All Rights Reserved.