본문 바로가기
Spring/DB_MyBatis

[mybatis] foreach활용하여 다중 update하기

by snow_hong 2025. 4. 28.

mybatis foreach를 활용해서 다중 update하는 방법을 알아보자!

 

다중 update문을 작성하기 위해서 foreach문을 활용하는데 문자가 부적합합니다 오류가 뜰 수 있는데요

원인은 mybatis에서 ; 기호는 인식이 불가능하며 그렇다고 공백으로 두면 실행이 안됩니다.

 

그래서 이럴 경우, 2가지 해결방안이 있습니다.

개인적으로 2번 방법 추천드려요!!

 

[java]

// 리스트를 500개씩 나눠서 반복 처리
 		List<LoginVO> toUpdate = new ArrayList<>();
        .....
        
        int chunkSize = 500;
        for (int i = 0; i < toUpdate.size(); i += chunkSize) {
            int end = Math.min(i + chunkSize, toUpdate.size());
            
            List<VO> ListName = toUpdate.subList(i, end);
            
            loginDAO.update("updateUserTest",ListName);
        }

1. application.yml 수정

[ sql ]

<update id="updateUserTest" parameterType="java.util.List">
    <foreach collection="ListName" item="item" separator=";">
        UPDATE TABLE
        SET 고객정보1 = #{item.고객정보1}
        WHERE 1=1
            AND 고객정보2 = #{item.고객정보2}
            AND 고객정보3 = #{item.고객정보3}
    </foreach>
</update>

 

[ application.yml ]

jdbc:mysql://접속정보&allowMultiQueries=true

MySQL JDBC 연결 시 여러 쿼리를 세미콜론(;)으로 구분해서 한 번에 보내게 허용하는 기능인 allowMultiQueries=true 옵션 추가해준다.

 

⭐단점 : 위험할 수 있음 (SQL Injection 위험성 ↑) , 웬만하면 운영환경 설정X

 

2. PL/SQL 방식 ⭐

기본 pl/sql 문법 예제

DECLARE 
    
    M_NAME VARCHAR2(50); --초기 변수 선언
    
    BEGIN
       
       M_NAME := '~~~~'; --변수에 값 대입 실시
         
       DBMS_OUTPUT.PUT_LINE('M_NAME : ' || M_NAME);
       
    END;
  • declare begin end - PL/SQL 기본 문법을 쿼리를 실행합니다
  • declare [선언부] - 변수, 상수를 선언할 수 있습니다
  • begin [실행부] - 제어, 반복문, 함수 등 다양한 로직 기술을 실행합니다
  • end [종료부] - 실행된 로직의 종료를 선언합니다

[ sql ]

<update id="updateUserTest" parameterType="java.util.List">
    <foreach collection="ListName" item="item" open="DECLARE BEGIN" separator=";" close="; END;">
        UPDATE TABLE
        SET 고객정보1 = #{item.고객정보1}
        WHERE 1=1
            AND 고객정보2 = #{item.고객정보2}
            AND 고객정보3 = #{item.고객정보3}
    </foreach>
</update>

 

[최종 실행 쿼리]

DECLARE BEGIN  
UPDATE SET ~~~~~~ ;
UPDATE SET ~~~~~~ ;
END;

 

1번 방법은 보안이슈가 있으니 2번으로 개발하시는 걸 추천드립니다!

2번 방법이 성능이나 코드 간결해서 좋습니다!

 

[참조 사이트]

https://tantangerine.tistory.com/189

https://techbrad.tistory.com/62

 

728x90

댓글