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
'Spring > DB_MyBatis' 카테고리의 다른 글
[MyBatis] parameter type string if문 사용법 (0) | 2024.01.15 |
---|---|
[ Mybatis / Spring ] foreach 구문을 이용해서 Insert 대량 삽입하기 (0) | 2022.03.15 |
[ mybatis ] insert/update 쿼리 실행 후 값 가져오기(useGeneratedKeys, keyProperty, SelectKey) (0) | 2022.03.15 |
[Spring] 검색 시 특수문자(%, _ , \) 포함하여 검색하기 (0) | 2022.03.10 |
[MyBatis] 개발 생산성 향상,중복 쿼리 줄이기 <sql>,<include> 개념 및 문법 (0) | 2022.03.10 |
댓글