독서하는 개발자's Blog

반응형

[SQL] ibatis iterator 사용방법 - 손쉽게 코딩하기



가끔 이런 문제가 생길때가 있다.


예를들어보자. 

1)   checkbox가 1,2,3,4 네개 일때, 1번부터 4번까지 다 체크하고 A테이블에 insert.

2)   2,3 체크해제하고 1,4번만 A테이블에 insert.

3)   2번에서 2,3번은 A테이블에서 삭제되어야하고 B테이블에 들어가야한다.

4)   결국에는 A테이블에는 체크되어있는 1,4번이 남고

B테이블에는 체크해제된 2,3번이 들어가야한다.


이런상황이 생겼을 경우


1)번 같은 경우는 단순 jsp에서 check된 파라미터를 배열로 넘기면 Controller에서 for문으로 insert처리를 하면 된다.

(물론 vo에는 check된 놈을 받을만한 list vo가 있어야겟지)


sql은

<insert id="insert_table" parameterClass="abcVO">

 insert into table명(컬럼명~~ , ~~) values ( )

</insert>

이런식으로 기본insert 하고 for문으로 돌리면 된다.



근데 문제는 2)번

이때부터 우리같은 초보 개발자는 생각을 해야한다...


for문을 두번돌려야하나 아니면 if문을 난사해야하나

참고로 나는 if문을 난사해서 기능을 만들긴 했지만 빠꾸먹었다.(참담)


빠꾸먹지않으려면 iterator를 써서 1,4번을 ArrayList에 넣고 map으로 xml에 보내면 된다.


음??? 뭔소리야


예를 들어보자.


Controller에서 우리는

ArrayList<Integer> arrayList = new ArrayList<Integer>();   이 놈과


arrayList를 집어넣을 map

HashMap<String, Object> hashmap = new HashMap<String, Object>();  이 놈이

필요하다!!!.


arrayList.add(Integer);

hashmap("checkboxid" , arrayList);

"ArrayList에 add로 check된 int값을 넣어주고 hashmap으로 arrayList를 checkboxid이라는 property로 xml에 넘겨주겟다."


우리는 당연히 add에는 check된 value가 들어가야한다.

문제로 보면 2)에 1, 4가 value가 된다.


그리고 xml에서는


이렇게 작성해주면 


"checkboxid라는 hashmap에 들어있는 arrayList에 담긴 integer를 iterate에 넣고

A테이블에서 select된 값이 CHECKBOXID와 같지 않은 값을 B테이블에 넣어라"


한마디로 A테이블에서 내가 체크한 값과 반대되는 값을 B테이블에 넣겠다는 것.


여기서 쓰인것이 iterate인데 맵과 리스트로 받은 값을 쿼리에 넣어줄 수 있고

여기서에 #checkboxid[]#를 출력하면 1) 의 1,4 번이 출력된다.

우리는 checkboxid라는 속성값을 위에서 hashmap("checkboxid" , arrayList);으로 넣어줬다.

arrayList에는 for문으로 돌린 check된 1,4번이 들어있는 상태.


iterate에서 property="checkboxid"는 checkboxid라는 놈을 찾아서 매핑을 하고

매핑이되면 #checkboxid[]#  <-- 이렇게 사용


perpend는 iterate가 실행되기 전에 쓰여질 sql문

open과 close는 ( 1 3 )으로 보여주기 위한 괄호 역할

conjunction은 변수값사이에 들어가는 역할 ex) conjunction=","은 1 , 3 이렇게 보여줌

conjunction이 OR이면 1 OR 3


즉, ibatis에서 iterator는 조건절에 여러개의 값을 넣고 출력할 때 많이쓴다.


혹시나 도움이 되셨다면 공감과 광고한번씩 눌러주세요 감사합니다

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band