MyBatis Map을 이용한 foreach 구문

SQL MyBatis

문제점 😅

여러 키값을 조건 데이터로 업데이트를 해야한다. Map을 이용하여 List와 기타 파라미터를 담고, foreach 구문을 돌리려고 하는데 MyBatis에서 사용법이 기억이 나질 않아서 정리해둔다.

해결책 😏

구조는 다음과 같으니 호출 로직과 xml 구문을 확인할 것!

cmCodeServiceImpl.java

HashMap<String, Object> map = new HashMap<String, Object>();
List<String> codeGroupIdArr = new ArrayList<String>();

for(TbSysCodeGroup tbSysCodeGroup : tbSysCodeGroupList) {
    codeGroupIdArr.add(tbSysCodeGroup.getCodeGroupId());
}

map.put("chgCodeGroupSe", "301");
map.put("codeGroupIdArr", codeGroupIdArr);

tbSysCodeGroupMapper.updateCodeGroupSe(map); // 공통코드 그룹(업무) 구분 일괄 수정

특별한 건 없고 다건의 키값이 필요하므로 Map에 List를 담았다.

cmCodeMapper.java

/**
 * 공통코드 그룹(업무) 구분 일괄 수정
 *
 * @param tbSysCodeGroup
 * @return
 */
public int updateCodeGroupSe(@Param("map") HashMap<String, Object> map);

DAO라고 생각하면 되겠다.

cmCodeMapper.xml

<!-- 공통코드 그룹(업무) 구분 일괄 수정 -->
<update id="updateCodeGroupSe">
    <![CDATA[
        UPDATE TB_SYS_CODE_GROUP
           SET CODE_GROUP_SE = #{map.chgCodeGroupSe}
        WHERE  CODE_GROUP_ID IN
    ]]>
        <foreach collection="map.codeGroupIdArr" item="item" separator="," open="(" close=")">
           #{item}
        </foreach>
</update>

collection에서 map에 담긴 List 키값을 설정해야한다. Map에 담긴 List를 쓰려면 상기 내용과 같이 foreach를 작성해야 정상적으로 데이터가 바인딩 된다.

마무리 😎

어렵지 않은 내용인데, Map 데이터를 MyBatis에서 사용하는 경우에 항상 생각이 안난다. Map에는 다양한 데이터를 담아서 MyBatis 구문을 이용하여 사용할 수 있으니 체크하자.

참고문헌 📝

https://velog.io/@kero1004/mybatis-Map%EC%95%88%EC%97%90List%EC%88%9C%ED%9A%8C%ED%95%98%EA%B8%B0
https://arcsit.tistory.com/entry/Mybatis-Foreach-List%EB%A5%BC-HashMap%EC%9C%BC%EB%A1%9C-%EC%A0%84%EB%8B%AC%EB%B0%9B%EC%95%98%EC%9D%84-%EA%B2%BD%EC%9A%B0