이번 포스팅은 mybatis를 활용해서 다중 update를 알아보려고 합니다
여기서 PL/SQL을 사용한다는 것이 조금은 다른점입니다
물론 아시는분은 뭐이게 달라라고 말할 수 있지만
그래도 모르는 사람들에게는 조금은 생소한 이야기입니다
우선 PL/SQL을 간단히 살펴보겠습니다
DECLARE
M_NAME VARCHAR2(50); --초기 변수 선언
BEGIN
M_NAME := '귤귤의대모험'; --변수에 값 대입 실시
DBMS_OUTPUT.PUT_LINE('M_NAME : ' || M_NAME);
DBMS_OUTPUT.PUT_LINE('=============================');
END;
- declare begin end - PL/SQL 기본 문법을 쿼리를 실행합니다
- declare [선언부] - 변수, 상수를 선언할 수 있습니다
- begin [실행부] - 제어, 반복문, 함수 등 다양한 로직 기술을 실행합니다
- end [종료부] - 실행된 로직의 종료를 선언합니다
실행한 결과는 DBMS_OUTPUT에서 확인할 수 있습니다
위와 같이 PL/SQL를 활용하여 SQL을 실행할 수 있습니다
그럼 이것을 mybatis와 같이 활용해서 update를 해겠습니다
우선 자바에서 서비스단에서 부터 시작해보겠습니다
유저의 계정제한 기능을 만드려고 합니다
프론트단에서 리스트형으로 아이디 정보를
받아서 데이터를 처리한다고 합시다
@Override
public int updateMbList(List<Map<String, Object>> mbList) throws Exception {
int resultCount = 0;
try {
resultCount = adminMbInfoDAO.updateMbList(mbList);
} catch(Exception e) {
logger.info(e.toString());
return 0;
}
return resultCount;
}
아래와 같이 DAO단을 호출하여 실행하게됩니다
mybatis의 foreach를 사용하여 전체 update문을 반복 실행하게 합니다
이때 중요한것은 PL/SQL을 사용한다는 점입니다
<update id="updateMbList" parameterType="java.util.List">
<foreach collection="list" index="index" item="mbInfo" open="DECLARE BEGIN" separator=";" close="; END;">
UPDATE
MB_MST
SET
UPDT_ID = #{mbInfo.mbId}
, UPD_DT = SYSDATE
, MB_TYPE= '0050'
, RSNS_RSTRC = #{mbInfo.rsnsRstrc}
WHERE MB_ID = #{mbInfo.mbId}
</foreach>
</update>
위의 foreach문을 자세히 보시면 open, separator, close가 보일것입니다
open은 처음 쿼리를 실행할 경우 사용할 문자이며,
separator는 반복문 한개가 끝나고 붙여줄 문자입니다
close는 반복문이 끝나면 마지막에 붙여줄 문자입니다
그럼 최종적으로 아래와 같이 PL/SQL문이 완성됩니다
당연히 #{}은 해당 값으로 치환이 될것입니다
DECLARE BEGIN
UPDATE
MB_MST
SET
UPDT_ID = #{mbInfo.mbId}
, UPD_DT = SYSDATE
, MB_TYPE= '0050'
, RSNS_RSTRC = #{mbInfo.rsnsRstrc}
WHERE MB_ID = #{mbInfo.mbId};
UPDATE
MB_MST
SET
UPDT_ID = #{mbInfo.mbId}
, UPD_DT = SYSDATE
, MB_TYPE= '0050'
, RSNS_RSTRC = #{mbInfo.rsnsRstrc}
WHERE MB_ID = #{mbInfo.mbId};
END
이 방법 이외에도
자바에서 for문을 돌려서 for문안에서 update문을 계속적으 실행하는 방법이 있을것입니다
하지만 이 방법보다는 지금 현재의 방법이 더 성능이나 코드의 간결함이 있으니
현재 위의 방법으로 해결하시길바랍니다
앞으로도 IT 개발 공부를 꾸준히 !!
아직 우리의 대모험은 끝나지 않았으니까요!!