흔히 DB의 PK를 auto increment로 두고 insert 작업을 수행하는 경우가 자주 있습니다.
그 때, 이 키를 가져와서 다른 테이블에 바로 저장하고 싶은 경우가 생긴다거나, 이 키 값을 알고 싶은 경우가 생기는 경우가 자주
발생합니다.
보통 한 트렌젝션으로 묶은 후에 INSERT 후에 바로 SELECT를 하여 키를 가져오는 방법이 있는데, Ibatis와 MyBatis에서는 이를 한
동작으로 연결하는 기능을 지원하는데 그것이 바로 selectkey입니다.
Ibatis에서는 바로 값을 반환했던 반면에 MyBatis에서는 값을 넘겨줬던 모델에 값을 담는 다소 특이한 방법을 사용합니다.
<insert id="insertImage"> INSERT INTO Image_Table(imageData, imageName) VALUES(#{imageData},#{imageName}) <selectKey keyProperty="imageKey" resultType="Integer" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> </insert> |
위와같이 Image_Table이라는 테이블에 imageData와 ImageName을 넣습니다. 그리고 ImageKey는 auto increment되어 자동으로
증가합니다.
INSERT구문은 별 다른게 없고, selectKey구문이 중요합니다.
keyProperty : 반환해줄 키의 이름
resultType : 반환해줄 타입
order :selectKey 안의 쿼리를 insert문보다 먼저 실행한다면 before, 나중에 실행한다면 after를 씁니다.
(이 경우에서는 insert되어 auto increment된 값을 구해와야 하니까 after를 하는게 맞겠습니다.)
그리고 selectkey 안의 값은 최근 실행된 쿼리의 내용을 불러오는 함수를 쓰면 됩니다.
mysql은 SELECT LAST_INSERT_ID()
mssql은 @@IDENTITY
오라클은 시퀀스를 사용하면 되겠습니다.
마지막으로 반환 값에 대한 이야기를 하겠습니다
Ibatis에서는 그냥 함수 자체에 반환 형을 써서 그 값을 리턴해왔지만, MyBatis는 전해준 VO객체에 값이 담기게 됩니다.
ImageVO imageVO = new ImageVO(); imageVO.setImageData(data); imageVO.setImageName(imgfile.getOriginalFilename()); insertImage(imageVO); |
위와 같은 방식으로 했다고 한다면 Ibatis에서는
int key = insertImage(imageVO); |
위처럼 바로 값을 받는 방식을 사용했었습니다.
int key = imageVO.getImageKey(); |
MyBatis에서는 위와 같은 방식으로 값을 전해줬던 VO에서 키가 자동으로 담기는 방식입니다.
'Spring&mybatis(ibatis)' 카테고리의 다른 글
ibatis 태그 지원 목록입니다 (0) | 2018.11.12 |
---|---|
mybatis 기호 비교 등등 (0) | 2018.10.26 |
a child container failed during start 에러 (0) | 2018.09.27 |
@RestController , @Controller 차이점입니다 (0) | 2018.03.20 |
Srping Hello 예제 (0) | 2015.03.30 |