자바

selectkey

chantleman 2024. 10. 15. 18:39

 

 

selectKey는 MyBatis에서 제공하는 기능으로

insert 구문을 실행하기 전이나 후에 특정 키값을 조회해서 파라미터 객체에 설정할 수 있게 해준당

 

주로 자동 생성되는 키 값을 얻거나 다음 시퀀스 값을 미리 조회하는데 사용되며

데이터 삽입 후 자동 생성된 키를 가져와서 추가적인 쿼리 없이도 필요한 키 값을 빠르게 얻을 수 있당

 

 

  1. 자동 생성 키 가져오기: 삽입 후에 자동 생성된 키를 빠르게 가져오는 데 유용
  2. 불필요한 쿼리 감소: 별도로 키를 가져오는 쿼리를 작성할 필요가 없어 전체 쿼리 수 감소
  3. 트랜잭션 관리: 삽입과 키 조회를 하나의 트랜잭션으로 묶어 관리해 일관성 유지

 

 

<selectKey resultType="키 타입" order="AFTER/BEFORE" keyProperty="">

 

 

<insert id="createPost" parameterType="kr.or.ddit.vo.LprodVO">
    <selectKey resultType="int" order="BEFORE" keyProperty="lprodId">
        SELECT NVL(MAX(lprod_id),0)+1 FROM lprod
    </selectKey>

    insert into lprod
    values(#{lprodId},#{lprodGu},#{lprodNm})
</insert>

 

요론식으로 Insert 하기 전에 selectKey로 id 조회해서 삽입하는 용도로 사용한당

 

 


 

근데 아래처럼 하면 안되낭?

<insert id="createPost" parameterType="kr.or.ddit.vo.LprodVO">
    insert into lprod
    values((SELECT NVL(MAX(lprod_id),0)+1 FROM lprod),#{lprodGu},#{lprodNm})
</insert>

 

해도 insert가 되기는 하지만

 

 

 

인라인서브쿼리로 했을때

 

 

detail 페이지로 넘어갈때 파라미터가 0으로 들어간당 !!

 

 

jsp에서 id를 controller로 안넘겨줘서 VO에 안담기게 돼서 0으로 들어가는 거시당

그래서 인라인서브쿼리로 하게되면 VO에 자동 설정되지 않아서 id를  select하는 별도의 쿼리를 작성해야하는 수고로움이 있당 ㅜㅜ

 

 

 

하지만 selectKey를 사용하면 jsp에서 id를 넘겨주지 않아도 자동으로 VO에 들어가져서 바로 id값을 불러올 수 있는 것이당

 

<insert id="createPost" parameterType="kr.or.ddit.vo.LprodVO">
    <selectKey resultType="int" order="BEFORE" keyProperty="lprodId">
        SELECT NVL(MAX(lprod_id),0)+1 FROM lprod
    </selectKey>

    insert into lprod
    values(#{lprodId},#{lprodGu},#{lprodNm})
</insert>

 

예를 들어 위 코드는 keyProperty="lprodId"는 조회된 값을 lprodId라는 VO객체의 속성에 저장하는 것이당

 

 

 

selectKey로 했을때

 

 

 

 

 

 

 

 

 

 

728x90