본문 바로가기
Java, Spring

[Java] Mybatis INSERT 후에 PK(시퀀스) 가져오기

by 혀나Lee 2016. 12. 30.

Java에서 Mybatis generator를 이용해서 Mapper.xml을 자동으로 생성할 수 있다. 하지만 기본적으로 있는 insert()와 insertSelective()를 사용하면 시퀀스값을 가져올 수가 없다.

이럴 때는 Mapper.xml을 추가로 구현해 주면 된다.

속성값에 대한 자세한 설명은 여기를 참고해주세요.

TestMapper.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="mapper.TestMapper">

<insert id="insertSelective" parameterType="com.mypackage.Test">

           ... 쿼리 또는 trim 형태의 key, value 쌍


<selectKey keyProperty="id" resultType="long" order="AFTER">

SELECT currval('seq_test');

</selectKey>

  </insert>


</mapper>


일단 기본적으로 generator에서 만들어진 insertSelective의 <insert>...</insert> 문을 복사해준다. 그리고 그 안에 <selectKey>...</selectKey> 의 태그를 넣어주면 된다. 물론 자신의 코드에 맞게 조금은 수정해 줘야 한다.

  • id: 구문을 찾기위한 구분자
  • parameterType: 구문에 전달될 파라미터의 패키지 경로를 포함한 전체 클래스 명이나 별칭
  • keyProperty: selectKey 하위 엘리먼트에 의해 리턴된 키를 셋팅할 프로퍼티를 지정. 디폴트는 셋팅하지 않는 것이다. 여러개의 컬럼을 사용한다면 프로퍼티명에 콤파를 구분자로 나열할 수 있다.
  • resultType: selectKey 하위 엘리먼트에 의해 리턴될 값의 타입
  • order: (BEFORE/AFTER)
    • BEFORE: 키를 먼저 조회하고 그 값을 keyProperty에 셋팅한 뒤 insert 구문 실행
    • AFTER: insert 구문을 실행한 후 selectKey 구문을 실행

TestMapper.java

public int insertSelective(Test param) {

return getSqlSession().insert("mapper.TestMapper.insertSelective"param);

}


generator로 만들어진 mapper 말고 추가로 Mapper class를 생성해 준 뒤, 위의 함수를 만들어 준다.

참고로 함수명은 자신이 사용하고 싶은데로 만들면 되며, insert() 함수의 첫번째 파라미터에는 TestMapper.xml 에 설정한 id값을 맞춰 설정하고 두번째 파라미터는 전달된 파라미터(model 오브젝트) 값을 설정한다.

서비스 구현 부분

tradeMapper.insertSelective(test);
int id = test.getId();

자신이 만든 Mapper.java 의 함수를 이용하여 insert를 한 후, getId() 와 같은 get<keyProperty값> 함수로 조회하면 된다.


댓글