본문 바로가기
SpringFramework | SpringBoot

[Mybatis] useGeneratedKeys와 selectKey

by Lcoding 2023. 11. 9.
반응형

autoincrement가 걸린 PK값을 바로 사용하고싶다면 어떻게 해야할까?

방법1
항상 useGeneratedKeys와 keyProperty는 함께 사용하면 된다.
<insert id="insertExample" useGeneratedKeys="true" keyProperty="userCode" parameterType="exampleVO"> 
INSERT INTO example 
   (name, email ) 
VALUES 
   (#{name}, #{email} ) 
</insert>


방법2
마이바티스는 자동생성키 칼럼을 지원하지 않는 다른 데이터베이스를 위해 다른 방법 또한 제공한다.
바로 selectKey를 이용하는 것이다.
아래 예제에서 selectKey구문이 먼저 실행되고 userCode 최대값에서 1씩 증가되게끔 셋팅된다.
그리고 나서 insert 구문이 실행된다. 이건 복잡한 자바코드 없이도 데이터베이스에 자동생성키의 행위와 비슷한 효과를 가지도록 해준다.

<insert id="insertExample">
  <selectKey keyProperty="userCode" resultType="int" order="BEFORE">
    SELECT IFNULL(MAX(userCode+1),1) FROM example
  </selectKey>
  INSERT INTO example
    (userCode, email)
  VALUES
      (#{userCode}, #{email})
</insert>


방법1과 방법2의 차이
위의 두 예시는 최근 userCode에서 +1을 해주는 결과를 나타낸다.
결과가 같은데 왜 방식이 두개일까? 사용방향에 따라 차이점이 존재하기때문이다.

방법 1은 DBMS의 도움이 필요하다. 즉 auto increment가 되는 DBMS만 사용가능하다.
만약 사용하는 DBMS는 AUTO INCREMENT를 지원해주지 않는다면 방법 2를 써야한다.


커스텀 - 아래 예시처럼 항상 5자리로 userCode를 등록할 수 있다.
<insert id="insertExample">
<selectKey resultType="int" keyProperty="userCode" order="BEFORE">
SELECT lpad(cast((IFNULL(MAX(userCode), 0) + 1) as char),5,'0') 
  FROM example
    </selectKey> 
  INSERT INTO example
    (userCode, email)
  VALUES
      (#{userCode}, #{email})
</insert>

반응형

'SpringFramework | SpringBoot' 카테고리의 다른 글

스프링 Transactional 정리  (0) 2023.11.10
spring 뷰 선택 우선 순위  (0) 2023.11.10
SpringBoot의 메인 메서드의 풀이  (0) 2023.11.09
SOLID원칙이란?  (0) 2023.11.09
REST API URI 작성 요령  (0) 2023.11.09

loading