MyBatis

MyBatis 에서의 자동증가 (Auto-Increatement, sequence) 값 가져오기.

Jungsoomin :) 2020. 7. 21. 16:04

참고문서 : https://taetaetae.github.io/2017/04/04/mybatis-useGeneratedKeys/

 

mybatis insert/update 쿼리실행후 결과 가져오기

Select문이 아닌 다른 SQL Query(insert, update 등) 를 실행하고서 결과를 봐야하는 상황이 생긴다. 정확히 잘 수행되었나에 대한 확인. 어떻게 쿼리가 잘 수행되었나를 확인하는 방법은 다음과 같다.※

taetaetae.github.io

 

꿈꾸는 태태태의 공간 님 의 문서 참조 입니다.


Mysql, MariaDB 에서 제공하는 자동증가 컬럼(Auto-Increament Cloumn)을 지원할 경우, VO 객체의 키 값에 대입하는 Propertyinsert,update시 자동증가 컬럼 값을 가져올 수 있다고 합니다.

mapper.insertStudents(student); // 쿼리실행
student.getId(); // 추출 가능

 


mapper.xml 파일에 <insert>나 <update> 태그의 속성 값으로

  1. useGenerateKeys 뜻 그대로 자동증가 키 사용여부true로 주고서,

  2. keyProperty 속성의 값으로 자동증가 키 컬럼에 해당되는 VO객체의 프로퍼티 명을 주면 되겠습니다.

<insert id="insertStudents" useGeneratedKeys="true" keyProperty="id" parameterType="Student">
  insert into Students ( name, email )
  values ( #{name}, #{email} )
</insert>

만약 사용하는 DataBase가 Oracle 같이 sequence를 제공하는 경우에는, 설정이 달라진다고 합니다.

 

mapper.xml 파일을 해당과 같이 수정 합니다. 추가된 것들에 대해 살펴봅니다.

  1. <selectKey>태그의 속성으로 VO객체의 시퀀스 값에 해당하는 Property명을 줍니다.

  2. <selectKey> 태그 속성의 order는 언제 작동하느냐인데 BEFORE로 주면 쿼리실행 전입니다.

  3. <selectKey> 태그의 몸통에 해당 시퀀스에 대한 출력을 합니다.

이렇게 사용하면 쿼리실행전에 selectKey에서 값을 받아오고 쿼리를 진행한다고 합니다.

<insert id="insertStudents" parameterType="Student">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    select SEQ_ID.nexyval FROM DUAL
  </selectKey>
  insert into Students
    (id, name , email)
  values
    (#{id}, #{name}, #{email})
</insert>

MySQL 이나 MariaDB를 사용하는 경우에나 Oracle 을 사용하는 경우 둘 다 이를 응용할 수 있는데, key값과 상관없는 값을 가져오는 넣어 해당값을 쿼리에 이용하는 것입니다.

<insert id="insertStudents" parameterType="Student">
  <selectKey keyProperty="regist_date" resultType="java.util.Date" order="AFTER">
    select regist_date FROM students WHERE id = #{id}
  </selectKey>
  insert into Students
    (id, name , email, regist_date)
  values
    (#{id}, #{name}, #{email}, syadate)
</insert>

order가 AFTER이니 쿼리 실행후에 selectKey의 쿼리를 실행함을 의미합니다.

 

즉 VO 객체에는 직접 값으로 준 id 값에 맞는 regist_date 컬럼의 값을 리턴받아 Property에 저장하게 됩니다.

 

데이터가 많을 경우에 즉각 데이터를 가져와야한다면, 사용함이 좋아보인다고 생각합니다.

'MyBatis' 카테고리의 다른 글

resultMap.  (0) 2020.09.08
log4jdbc-log4j2  (0) 2020.08.02
Mybatis 콘솔에 쿼리문 및, 결과 출력-  (0) 2020.07.19
log4j.xml  (0) 2020.07.18
Mybatis, 테이블 연동과 기본적인 DML 조작  (0) 2020.07.18