2F(IT)/툴 설정 및 사용법

[MyBatis] Mybatis 반복문(foreach) 쓰는 법

백화점장 2024. 12. 27. 22:44
반응형
※ 실제 프로젝트를 진행하며 얻은 지식을 정리한 내용입니다.
※ 이론적인 내용보단 실무에서 사용하는 방식 위주로 작성하였습니다.
※ 잘못된 내용이 있다면 댓글로 지적 부탁드리겠습니다.

1. <foreach> 태그의 기본 개념

    1) <foreach> 태그는 컬렉션(리스트, 배열 등)을 순회하며 SQL 문을 동적으로 생성합니다.

    2) 이 태그를 사용하면 SQL 문 안에서 반복적인 데이터를 처리할 수 있습니다.

    3) 기본 요소

<foreach collection="data" item="item" open="(" separator="," close=")">
	#{item.seq}
</foreach>

        1. collection: 반복할 데이터(List, 배열 등). 화면에서 던진 파라미터명과 같으면 사용하기에 편리합니다.

        2. item: collection에 접근할 변수

        3. open/close: 반복문 앞뒤에 추가할 문자열(괄호, 구분자 등).

        4. separator: 반복 항목 사이에 구분자를 추가합니다.


2. UPDATE 예시

-- 키만 받아 update하는 경우
<update id="keyUpdate">
    UPDATE tab1
       SET col1 = 'N'
         , col2 = NOW()
         , col3 = #{userId}
     WHERE col4 IN
     <foreach collection="reqParam" item="item" open="(" separator="," close=")">
        #{item.param1}
     </foreach>
</update> 
 
 -- 파라미터 전체
<update id="multiUpdate">
  <foreach collection="products" item="item" separator=";">
    UPDATE products
       SET param2 = #{item.param2}
         , param3 = #{item.param3}
         , param4 = #{item.param4}
         , param5 = #{item.param5}
         , updated_at = NOW()
     WHERE param1 = #{item.param1}  <!-- 각 항목에 대해 WHERE 절을 설정 -->
  </foreach>
</update>

        1. Where절에 특정 컬럼에 IN절을 활용하거나 전체를 여러번 UPDATE할 수 있습니다.

        2. collection 같은 경우 ajax호출 시 던진 파라미터명과 맞춰주어야 합니다.

        3. 예시로 아래와 같은 소스가 있을 때 data : {  }  안에 있는, reqParam과 Mybatis의 collection값과 같아야 합니다.

            3-1. 꼭 같지 않아도 별도 처리를 통해 가능하지만, 그냥 맞춰서 사용하는 것이 편리합니다.

        4. item은 반복하는 개체에 접근이 가능한 변수입니다. 변수명은 자유롭게 사용해도 됩니다.

$.ajax({
  url: '/example/main', // 요청을 보낼 URL
  type: 'POST', // HTTP 메서드 (POST 방식)
  data: { // 서버로 보낼 데이터
    reqParam : params
  },
  success: function(response) {
    console.log(response); // 서버 응답 처리
  },
  error: function(xhr, status, error) {
    console.log('Error:', error);
  }
});

 

        5. 위 예시에서 data에 있는 파라미터(params) 값은 꼭 배열로 던져야 합니다. (params는 객체배열이라고 가정)


3. DELETE문 예시

<delete id="keyDelete">
    DELETE
      FROM tab1
     WHERE col1 = 'N'
         , col2 = #{userId}
         , col4 IN <foreach collection="reqParam" item="item" open="(" separator="," close=")">
                        #{item.seq}
                    </foreach>
<delete>

4. INSERT문 예시

<insert id="multiInsert">
    INSERT INTO 테이블명 (컬럼1, 컬럼2, 컬럼3, ...)
    VALUES <foreach collection="reqParam" item="item" separator=",">
         (  #{item.param1}
          , #{item.param2}
          , #{item.param3}
          , 'A',
          , {item.param4}
          , NOW()
          , #{item.param5}
          , NOW()
        )
          </foreach>
</insert>

    1) INSERT의 경우는 VALUES에 작성하여 사용 가능합니다.

반응형