혜미의 개발 일지
[SQL] selectkey 본문
들어가기전에
xml은 마크업언어이다.
그리고 마크와 마크 사이는 프로그램하나의 함수라고 생각하면 selectkey의 개념을 이해하기 쉽다.
[설명]
selectkey 의 사용은 우리가 어떤 생성된 코드를 바로 다른 쿼리에서 사용하고 싶을때 사용한다.
예를 들어 아래쿼리와 같이 내가 하나의 site_id를 새로 생성해 넣는다고 가정하자.
site_id를 insert시킬때 함수로 site 테이블에는 넣어서 생성했는데
바로 그 site_id를 사용해서 다른 테이블에 넣고 싶을때 어떻게 해야할까?
원래대로라면 아래쿼리가 작동된후 site테이블에서 site_id를 조회한 후 그 값을 가져다가 다른테이블에 inset시켜야할 것이다.
하지만 작업이 ui에서 동시에 이뤄지는 작업이라서 DB를 통해 site_id값을 파라미터로 받아올 수 없을 때
selectkey 를 이용하면 해당 쿼리에서 리턴형식으로 보관했다가 다른 쿼리에 받아서 사용할 수 있다.
[코드 및 실습]
<insert id="insertSite" parameterType="siteVO" >
/** insertSite ::: 사이트를 저장한다. */
<![CDATA[
DECLARE @SITE_ID VARCHAR(20);
SELECT
@SITE_ID = RIGHT( '000' + CONVERT( VARCHAR(10), ISNULL( MAX( CONVERT( INT, SITE_ID ) ), 0) + 1 ) , 8 )
FROM DBO.SITE_MST_T;
INSERT INTO DBO.SITE_MST_T (
SITE_ID
, CREATED_AT
) VALUES (
@SITE_ID
,GETDATE()
)
]]>
<selectKey keyProperty="siteId" resultType="String" order="AFTER">
SELECT TOP 1 SITE_ID AS siteId FROM DBO.SITE_MST_T ORDER BY SITE_ID DESC
</selectKey>
</insert>
이렇게 site_id 생성시 쿼리 마지막에 삽입해 값을 담아두면 된다.
작성 방식은 ibaytis 나 mubatis 일때마다 다르다. 그러니 잘 검색해서 사용해야한다.
그리고 저기서 스트링 형식으로 리턴값을 선언하였기에 sreviceDAO에서 이렇게 값을 작성해야 받아올 수 있었다.
public String insertSite(SiteVO siteVO)throws Exception{
return String.valueOf( insert("insertSite",siteVO) );
}
[마무리 참조] ibaytis 나 mubatis 적용시 이슈 참조
mybatis, ibatis selectKey 이슈 해결
selectKey 이슈 해결
velog.io
참고 : 필자의 개인적 이해를 바탕으로 쓴 글임으로 만일, 잘못된 정보나 지식이 있다면 알려주시길 바랍니다.