본문 바로가기
카테고리 없음

프로젝트] Mybatis UPDATE Multi ForEach 하기

by 쌈빡한 쥬니준 2020. 7. 13.

1. allowMultiQueries=trueallowMultiQueries=true

을 해줘야한다.

* 현재 스프링부트를 이용중이여서 application.properties 사용하고 있는데.. 현 프로젝트는 공통으로 따로 빼놓은 부분이 있다. 무튼 spring.datasource.jdbc-url=jdbc.log4jdbc:mysql://localhost:8080/myDB?CharSet=

utf8&useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true

이런식으로 붙여서 멀티업데이트를 하게끔 설정을 해줘야한다.

 

* 확실치는 않지만 DBeaver 에서 Driver Properties 에 똑같은 위와 같은 멀티쿼리 옵션이 있는데 이것을 true 로 바꿨을 떄 동일한 동작을 하는지는 실험(?)을 해봐야지 알 것 같다.

 

2. Mybatis 에서는 전체를 foreach로 감싸줘야한다.

<update id="updateReserveListStatus" parameterType="ReserveVO">
    <foreach item="item" index="index" collection="listMap" open="" close="" separator=";">
    UPDATE t_reserve
        SET rs_status = #{item.rsStatus}
            ,update_dt = NOW()
            ,update_idkey = #{item.idkey}
WHERE 1=1
        <!--<if test='rsSeq != null and rsSeq.size != 0'>-->
            AND rs_seq = #{item.rsSeq}
    </foreach>
</update>

현재 parameterType 은 VO로 받고 있다.

item은 쿼리의 alias 와 같은 거라고 생각하면 되는데 . 을 통해서 위와 같이 해당하는 parameter에 접근이 가능하다.

여기서는 전체를 돌리기 때문에 굳이 open과 close 를 따로 설정할 필요는 없다.

collection 에는 list와 array 형식으로만 가능하다. 즉, foreach 는 list, array 만 가능하다는 소리인데...

 

listMap 이라는 것은 어디서 오는걸까?

 

위에서 언급했듯이 VO를 통해서 foreach를 돌리고 있다.

VO를 하지 않고 Map으로 받으면 모를까... 일단 VO로 하고 있다.

 

여기서 VO 인데 collection에 listMap(이름때문에 헷갈리면 안된다..단순히 Map 이다) 이라는 될 수 있는 이유는..

VO 에 private List<HashMap<String, Object>> listMap; 이라고 선언을 해놨기 때문에 가능한 것이다.

 

이렇게 VO안에 선언을 해놨기 때문에 parameterType 은 VO로 가능하고 foreach 의 collection은 list로 가능한 것이다.

 

그럼 이제 ServiceImpl 단에서는 JSP 앞단에서 받은 배열을 풀어서 아래와 같이 Map에 담아 ArrayList 로 보내면 된다.

public int updateReserveListStatus(ReserveVO reserveVO) {
ArrayList list = new ArrayList();


String[] arrRsSeq = reserveVO.getArrRsSeq();
String[] arrRsStatus = reserveVO.getArrRsStatus();

int rtn = 0;
for(String arr : arrRsSeq) {
HashMap<String, Object> valueHash = new HashMap<>();
valueHash.put("idkey", memberService.getLoginUpidkey());
valueHash.put("rsSeq", arrRsSeq[rtn]);
valueHash.put("rsStatus", arrRsStatus[rtn]);
list.add(valueHash);

rtn++;
}
reserveVO.setListMap(list);

rtn = reserveMapper.updateReserveListStatus(reserveVO);
if(rtn != 1) throw new BusinessException("저장 실패");
return rtn;
}

 

익숙치 않은 부분들이 계속 나오다보니 쉬워보이는 것들도 시간이 너무 오래걸린다....

 

휴...

댓글0