MyBatis传入list,foreach的使用

MyBatis foreach的使用

foreach
动态 SQL 的一个常用的操作需求是对一个集合进行遍历,通常是在构建 IN 条件语句的时候。比如1

<select id="getSonSonId" parameterType="java.lang.Integer" resultType="java.lang.Integer">
	SELECT horse_id FROM horse_basic 
	WHERE horse_father_id IN 
	<foreach collection="sonIdList" index="index" item="item" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

批量添加的时候。比如:

<insert id="insertImg"  parameterType="com.xxx.platform.entity.SuggestionCustom">
	INSERT INTO suggestion_img 
	    (   
	        suggestion_id,
	        img_path,
	        add_time
	    )
    VALUES
    	<foreach collection="imgList" item="imgList" index="index" separator=",">
    	(
        	#{suggestion_id},
    		#{imgList},
        	#{suggestion_date}
   	 	)
    	</foreach>
</insert>

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。

注:你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象传递给 foreach 作为集合参数。当使用可迭代对象或者数组时,index 是当前迭代的次数,item 的值是本次迭代获取的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。

foreach的属性2主要有 item,index,collection,open,separator,close。

  • item表示集合中每一个元素进行迭代时的别名,
  • index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
  • open表示该语句以什么开始,
  • separator表示在每次进行迭代之间以什么符号作为分隔 符,
  • close表示以什么结束。

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

  • 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  • 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  • 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的。map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

  1. mybatis ↩︎

  2. collection的三种用法 ↩︎

MyBatis-Plus 提供了 `foreach` 标签,用于在 SQL 中动态生成 `IN`、`VALUES`、`SET` 等语句。以下是 `foreach` 的使用方法: 1. 在 XML 中使用 `foreach` 标签 ```xml <select id="selectByIdList" resultType="com.example.entity.User"> SELECT * FROM user WHERE id IN <foreach collection="idList" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> ``` 2. 在注解中使用 `@foreach` 注解 ```java @Select("SELECT * FROM user WHERE id IN " + "<foreach collection='idList' item='id' open='(' separator=',' close=')'>" + "#{id}" + "</foreach>") List<User> selectByIdList(@Param("idList") List<Long> idList); ``` 以上两种方式的效果相同,都是根据传入的 `idList` 生成 `IN` 语句。 `foreach` 标签的属性说明: - `collection`:需要遍历的集合或数组。 - `item`:遍历集合或数组时,当前元素的别名。 - `open`:遍历集合或数组时,生成 SQL 语句的开头。 - `separator`:遍历集合或数组时,生成 SQL 语句的分隔符。 - `close`:遍历集合或数组时,生成 SQL 语句的结尾。 - `index`:遍历集合或数组时,当前元素的下标。 - `javaType`:遍历集合或数组时,当前元素的类型。 - `jdbcType`:遍历集合或数组时,当前元素在 SQL 中的类型。 - `property`:遍历集合或数组时,当前元素的属性名。适用于对象集合或数组。 注意事项: - `collection` 属性可以使用 OGNL 表达式,例如 `collection="#{userList}"`。 - 如果遍历的是对象集合或数组,可以使用 `property` 指定当前元素的属性名。 - 如果集合或数组中的元素是简单类型(如 int、String),可以省略 `javaType` 和 `jdbcType` 属性。如果是复杂类型(如 Date、BigDecimal),需要指定 `javaType` 和 `jdbcType`。 - `foreach` 中可以嵌套 `if`、`where`、`set` 等标签,以实现更复杂的 SQL 生成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值