for each
for each
오늘은 자바에서 for문을 돌지 않고, Mybatis의 for each
를 사용하는, 동적 쿼리를
사용해 보았다. 우선 코드는 n개 이상의 로우값을 업데이트 해줘야하는 경우여서 사용.
<update id="updateUseYn" parameterType="FileVo">
<foreach collection="dataSeqList" item="fileVo" index="index" open="" close="" separator=";">
UPDATE
DRIVE_DATA
SET
USE_YN = #{useYn}
WHERE
DATA_SEQ = #{fileVo.dataSeq}
</foreach>
</update>
속성 값
⒈ collection 속성
void updateUseYn(List<FileVo> dataSeqList, String useYn);
Mapper 인터페이스에서 위와 같은 추상메서드를 작성하였다.
collection 속성에는 앞에서 전달 받은 인자값을 사용한다.
Map, Array, List, Set 등과 같은 반복 가능한 객체를 전달할 수 있다.
⒉ item 속성
위에서 본 dataSeqList의 별칭(alias)
⒊ open 속성
쿼리 구문이 시작될때 삽입할 문자열을 속성 값으로 삽입한다.
⒋ close 속성
구문이 종료될때 삽입할 문자열을 속성 값으로 삽입한다.
⒌ separator 속성
반복되는 구문 사이에 삽입할 문자열을 속성값으로 삽입한다.
⒍ index 속성
index값을 부를 일종의 변수명을 속성값으로 삽입한다.
태그 내에 #{index}
를 통해 호출할 때 0부터 반환된다.
실행 결과
로그를 깔끔하게 정리해봤다. 원하는대로 3번의 쿼리가 반복 호출되었다.
Preparing:
UPDATE DRIVE_DATA SET USE_YN = ? WHERE DATA_SEQ = ? ;
UPDATE DRIVE_DATA SET USE_YN = ? WHERE DATA_SEQ = ? ;
UPDATE DRIVE_DATA SET USE_YN = ? WHERE DATA_SEQ = ?
Parameters:
N(String), 9(String),
N(String), 10(String),
N(String), 11(String)
Updates:
1
Oracle
2022.08.22 추가
Oracle DB를 Mybatis에서 사용하면 아래와 같이 사용한다고 한다.
INSERT
<insert id="addImmunization" parameterType="List">
<foreach collection="immunizationCds" item="immunizationCd" index="index" open="INSERT ALL" close="SELECT * FROM DUAL" separator="">
INTO IMMUNIZATION (
MEMBER_SEQ
,IMMUNIZATION_CD
,IMMUNIZATION_REPORT_CHECK
) VALUES
(#{memberSeq}, #{immunizationCd}, 'A')
</foreach>
</insert>
UPDATE
<update id="updateWaitingNum" parameterType="List">
UPDATE EVALUATE_RESERV er
SET er.EVALUATE_RESERVE_ORDER = er.EVALUATE_RESERVE_ORDER - 1
<foreach collection="memberSeqList" item="memberSeq" separator=";" open="DECLARE BEGIN" close="; END;">
WHERE er.MEMBER_SEQ = #{memberSeq}
</foreach>
</update>