른록노트

[Mssql] Mybatis Dynamic Sql foreach 사용법 본문

DB/[Mssql]

[Mssql] Mybatis Dynamic Sql foreach 사용법

른록 2021. 12. 22. 11:28

1.1 문제상황

화면에서 checkIdx라는 체크박스를 받아와서 체크한 글만 삭제하는 기능을 만들려고 했는데
TestTable의 idx컬럼은 int 타입이고 checkIdx는 String 타입이라 in을 사용할 수가 없다.

1.2 예시

<delete id="deleteTest" parameterType="testVO">
    DELETE TestTable where idx in (#{checkIdx})
</delete>

checkIdx 의 타입은 String 값은 84,85,86
DELETE TestTable where idx in ("84,85,86") => 에러 발생

2.1 해결

checkIdx의 타입을 String으로 이용해서 해결방법을 찾아보려했는데 정보가 많이 없었고
미래적인 측면에서 String 배열로 변경하여 Dynamic sql foreach를 사용하는게 좋겠다고 판단했다.

2.2 해결방법

먼저 testVO에서 checkIdx의 타입을 String[]로 변경하고 쿼리를 아래와 같이 변경해주었다.

<delete id="deleteTest" parameterType="testVO">
    DELETE TestTable where idx in
    <foreach item="data" index="index" collection="idx" open="(" separator="," close=")">
        #{data}
    </foreach>
</delete>

item = foreach 안에 태그에서 #{???}로 사용할 이름
index = foreach 안에 태그에서 #{???}로 사용할 인덱스명
collection = parameterType에서 전달하는 변수명
separator : foreach 문이 한번 돌고 다음번 돌때의 구분자

참고사이트

Mybatis Dynamic Sql

반응형
Comments