iBATIS에서 selectKey 사용하기
Spring/주소록 만들기 : 2006. 11. 23. 21:09
수정해야 할 것 중에 4번에 해당 했던 것을 오늘에서야 수정했습니다. DB 인코딩 문제도 해결하고 오늘 아주 수확이 좋습니다.
id값을 예측 할 수 없었던 상황
DB를 MySQL을 사용할 때 ID 값을 AUTO_INCREMENT로 설정해 두었더니 ID값은 트랜잭션이 끝나고 롤백이 되지 않고 그대로 쌓여나가게 됩니다. 따라서 get(int id)와 같은 메소드로 DB에서 id를 사용해서 특정 값을 가져오고 싶은데 id값을 예측할 수 없기 때문에 테스트를 할 수가 없습니다.
DB를 MySQL을 사용할 때 ID 값을 AUTO_INCREMENT로 설정해 두었더니 ID값은 트랜잭션이 끝나고 롤백이 되지 않고 그대로 쌓여나가게 됩니다. 따라서 get(int id)와 같은 메소드로 DB에서 id를 사용해서 특정 값을 가져오고 싶은데 id값을 예측할 수 없기 때문에 테스트를 할 수가 없습니다.
id값을 임의로 지정해 주었던 상황
Member 테이블의 id 속성에서 AUTO_INCREMENT를 삭제하고 내가 원하는 id값으로 Member객체의 데이터를 세팅하고 Member 객체를 테이블에 insert할 때 id 값도 명시적으로 넣었습니다.
별 문제는 없지만 일일히 id를 신경써야 한다는 것이 다소 불편합니다. 그리고 왠지 AUTO_INCREMENT를 쓰고 싶습니다.
Member 테이블의 id 속성에서 AUTO_INCREMENT를 삭제하고 내가 원하는 id값으로 Member객체의 데이터를 세팅하고 Member 객체를 테이블에 insert할 때 id 값도 명시적으로 넣었습니다.
별 문제는 없지만 일일히 id를 신경써야 한다는 것이 다소 불편합니다. 그리고 왠지 AUTO_INCREMENT를 쓰고 싶습니다.
AUTO_INCREMENT를 사용해도 id값을 알 수 있게 된 상황
그래서 DB에 insert 할 때 selectKey 태그를 사용해서 주키 값을 반환하여 DB에 삽입한 객체의 id 값을 setting해 주기로 했습니다.
그렇게 하면 Member객체를 DB에 insert할 때 id값은 세팅되지 않은 상태에서 DB에 들어가게 되고 들어갈 때 selectKey 태그에서 주키 값을 반환 받아서 Member 객체의 id 필드에 세팅해주면 됩니다.
iBATIS 소스보기
녹색 부분이 selectKey를 사용한 부분인데 영회형의 말에 따르면 이 부분이 INSERT 문 위에 와야 하는 DB도 있다고 합니다. 하지만 Postgres와 MySQL의 경우에는 INSERT문이 끝나고 해보니 되네요.
selectKey로 둘러쌓인 SELECT LAST_INSERT_ID(); 이 문장은 주키 값을 select하는 SQL입니다. 이 때 MySQL에 있는 LAST_INSERT_ID() 라는 함수를 사용하였습니다.
그리고 이 부분을 사용하는 SqlmapMemberDao 클래스의 코드에는 다음과 같이 수정합니다.
그래서 DB에 insert 할 때 selectKey 태그를 사용해서 주키 값을 반환하여 DB에 삽입한 객체의 id 값을 setting해 주기로 했습니다.
그렇게 하면 Member객체를 DB에 insert할 때 id값은 세팅되지 않은 상태에서 DB에 들어가게 되고 들어갈 때 selectKey 태그에서 주키 값을 반환 받아서 Member 객체의 id 필드에 세팅해주면 됩니다.
iBATIS 소스보기
녹색 부분이 selectKey를 사용한 부분인데 영회형의 말에 따르면 이 부분이 INSERT 문 위에 와야 하는 DB도 있다고 합니다. 하지만 Postgres와 MySQL의 경우에는 INSERT문이 끝나고 해보니 되네요.
selectKey로 둘러쌓인 SELECT LAST_INSERT_ID(); 이 문장은 주키 값을 select하는 SQL입니다. 이 때 MySQL에 있는 LAST_INSERT_ID() 라는 함수를 사용하였습니다.
그리고 이 부분을 사용하는 SqlmapMemberDao 클래스의 코드에는 다음과 같이 수정합니다.
'Spring > 주소록 만들기' 카테고리의 다른 글
세련된 SQL map (iBATIS) (0) | 2006.12.04 |
---|---|
메소드 추상화 (2) | 2006.12.04 |
log4j.properties 파일 위치 시키기 (2) | 2006.12.04 |
log4j 설정하기(in spring) (0) | 2006.12.02 |
수정해야 할 것들 (2) | 2006.11.28 |
iBATIS에서 selectKey 사용하기 (2) | 2006.11.23 |
MySQL 설치 시 주의 할 점 (6) | 2006.11.23 |
DB 인코딩 문제 (0) | 2006.11.20 |
SqlMapClientDaoSupport (0) | 2006.11.18 |
AbstractTransactionalDataSourceSpringContextTests (4) | 2006.11.13 |
회원 목록 추가 (0) | 2006.11.13 |
글 잘보고 있네여 ㅋㅋ 질문이 있어서 코멘트 남기네요.
AUTO_INCREMENT 없이 예를들어 A테이블에 a,b 가 결합 PK 로 되어있는상태라면
a에대한 b가 AUTO_INCREMENT 되어야하거든요 그렇게 되질않아서.
MAX를 해서 최대값가져오면 풀스캔 일어나니깐.
Limit 1 해서 가장 마지막거를 가져와서 + 1 해주려고하거든여.
근데 저도 iBatis 사용하는데... selectkey 를 이용해서 해주면되겠지만 데이터가 없을때는
그렇지 않으니깐 문제거든요..
물론 각각의 쿼리를 별도로만들어서 하면되겠지만...
SelectKey 를 두번 사용을 할수없나해서요... 그럼 첫번째 건이 null 이거나 행이 없는경우.
다음 selectkey를 이용한다거나 ...
혹시 있다면 여기에대해서 조언좀 해주세요..^^
흠.. iBatis는 저 당시 잠시 보고 안 해봐서 새하얗게 잊어버렸습니다. 저 글을 제가 썼던 글인가 싶을 정도로 생소하네요.
주키를 복잡하게 생성하시는 군요. 주키 값을 만드는 로직을 프로시저로 만들고 해당 프로시저를 매번 호출하도록 하는것은 어떨런지요.
흠~ DB와 iBatis는 잘 몰라서요. ^^;