Mybatis - foreach문(동적 SQL)

 

foreach문

여러 개를 insert하거나 delete하고 싶을때가 있다.
쿼리를 단일로 보내지 말고 한 번에 동적으로 foreach문을 사용해서 insert, delete해보자

<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
	#{item}
</foreach>
  • collection : 전달받은 인자값
  • item : 전달받은 인자 값을 사용할 alias명
  • open : 해당 구문이 시작될 때 삽입할 문자열
  • close : 해당 구문이 종료될 때 삽입할 문자열
  • separator : 반복되는 구문사이에 구분값
  • index : 반복되는 구문 번호 (0부터시작)

INSERT (ArrayList<Map<String, Object»로 전달)

<insert id="addItem" parameterType = "map">
		INSERT ALL INTO TABLE_NAME(
			SEQ_IDN,
			A, B, C)
       <foreach collection="list" item="item" index="i" separator="INTO TABLE_NAME">
          VALUES (
              (SELECT MAX(SEQ_IDN)+#{i} FROM TABLE_NAME),
              #{item.A}, #{item.B}, #{item.C}
          )
       </foreach>
    SELECT * FROM DUAL
</insert>

INSERT ALL 구문을 사용하여 INSERT를 해보았다. (INSERT ALL 맨 뒤에는 SELECT * FROM DUAL를 붙여야한다.
구분값으로 INTO TABLE_NAME을 사용하여 VALUES(....)를 반복하였다.
index=”i”를 사용하여 SELECT MAX(SEQ_IDN)+#{i} FROM TABLE_NAME MAX값을 뽑아 사용할 수 있다.
전달한 Map값의 Key값(여기선 A)을 item뒤에 붙여서 #{item.A}처럼 사용한다.

DELETE (List로 전달)

<delete id="deleteItem" parameterType="List">
	DELETE FROM TABLE_NAME
	WHERE
		SEQ_IDN IN
    <foreach collection="list" item="item" index="i" open="(" separator="," close=")">
      #{item}
    </foreach>
</delete>

List를 인자로 받아 사용할때 #{item}처럼 지정한 alias명만 써주면 된다.