Mybatis动态SQL中使用foreach标签遍历集合、字符串入参

如题,foreach就是迭代遍历,和你我在spring里面面对集合对象、数组对象写for系列遍历的时候作用一样;而在SQL中,foreach遍历通常用在in这个关键词后面。如果是mybatis动态SQL,那就在in关键字后面用的标签,既然是标签,那就有它这个标签内置所需要的参数,也就是foreach元素的属性,主要有item、index、collection、open、separator、close这六种,xml中如下所示:
 

<foreach collection="" close="" index="" item="" open="" separator="">
...
</foreach>

解释这几个标签属性:

  • item:表示集合中的每一个元素进行迭代时的别名。
  • index:用于表示在迭代的过程中,每次迭代到的位置。
  • open:表示该语句以什么开始。
  • separator:表示在每次迭代之间以什么符号作为分隔符。
  • close:表示以什么结束。
  • 重点: collection属性最为重要,既然是迭代就表示传入的参数是多个,且参数的类型可能为:list列表、数组array、哈希map。

下面对这三种情况进行说明:

情况1,传入list列表参数:

  • 修改mapper.class的接口类文件,增加findStudentByList方法:
/**
*传入列表
*
*/
public List<Student> findStudentByList(List<Integer> ids);


说明:以List且泛型为Student实体类来接收查询结果,入参为ids,多个Integer型id组成的列表。

  • 修改StudentMapper.xml文件,写对应方法的动态SQL:
<select id "findStudentByList" parameterType="Integer" resultType="com.ali.entity.Student">
    select id,st_name,st_age from t_student where id in
    <foreach collection="list" item="item_id" open"(" separator=","        close=")">
       #{item_id}
    </foreach>
</select>

说明:select标签,id为对应mapper接口类里面的方法名,resultType对应结果类型的entity类,foreach标签中的属性定义说明:传入集合类型为列表,每一个元素迭代时的别名为item_id,该语句以“(”开始,每次进行迭代之间以“,”作为分隔符,并以“)”为结束。

情况2,传入array数组参数:

  • 修改mapper.class的接口类文件,增加findStudentByArray方法:
/**
*传入数组
*
*/
public List<Student> findStudentByArray(Integer[] ids);


说明:入参类型为Integer类型数组对象ids,返回类型为Student泛型的列表。

  • 修改StudentMapper.xml文件,写对应方法的动态SQL:
<select id="findStudentByArray" parameterType="Integer"  resultType="com.ali.entity.Student">
 select id,st_name,st_age from t_student where id in
    <foreach collection="array" item="item_id" open"(" separator=","        close=")">
       #{item_id}
    </foreach>
</select>


说明:select标签,id为对应mapper接口类里面的方法名,resultType对应结果类型的entity类,foreach标签中的属性定义说明:传入集合类型为列表,每一个元素迭代时的别名为item_id,该语句以“(”开始,每次进行迭代之间以“,”作为分隔符,并以“)”为结束。

情况3,传入hash哈希参数:
修改mapper.class的接口类文件,增加findStudentByMap方法:

/**
*传入哈希
*
*/
public List<Map> findStudentByMap(Map<String,Object> ids);


说明: mapper的接口文件,入参:键为String值为Object的Map类型的对象ids

  • 修改对应mapper.xml文件:
<select id="findStudentByMap" parameterType="Map" resultType="com.ali.entity.Student">
  select id,st_name,st_age from t_student where id in
     <foreach collection="ids" item="item_id" open="(" separator=","     close=")">
         #{item_id}
     </foreach>
</select>


特别注意:

传入为map时,collection的值“ids”是存储在map中的键key(比如 map.put(“ids”,ids)这个键的字符串不是随便写的,是对应的)。
说明:select标签,id为对应mapper接口类里面的方法名,resultType对应结果类型的entity类,foreach标签中的属性定义说明:传入集合类型为列表,每一个元素迭代时的别名为item_id,该语句以“(”开始,每次进行迭代之间以“,”作为分隔符,并以“)”为结束。

以上就是传入集合、数组参数的时候,遍历这两种对象里面的元素内容。所用的例子,可用于检索查询的各种场景。
 

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值