2013-03-05 5 views
4

Oracle 테이블에 일부 데이터를 삽입하고 삽입 된 행의 id을 검색해야합니다. 해당 id 시퀀스에 의해 생성 된 다음 트리거에 의해 테이블에 삽입됩니다.MyBatis를 사용하여 Oracle에서 마지막 삽입 ID를 얻는 방법은 무엇입니까?

는 지금, 나는 JDBC를 사용할 때 삽입 된 행의 ID를 얻을 수있는 여러 가지 방법이 있습니다 알고 있지만 나는 INSERT 명령을 실행 MyBatis을 사용하고 있기 때문에, 나는 ID를 얻는 방법을 알아낼 수없는 것 내 데이터를 삽입 한 후. 모든 조언을 크게 주시면 감사하겠습니다.

+0

이것은 MySQL에 대한 질문이지만 올바른 방향으로 사용자를 안내 할 수 있습니다. http://stackoverflow.com/questions/4283159/how-to-return-ids-on-inserts-with-mybat is-in-mysql-with-annotations –

+1

@Insert ("직원의 값 ('john', 'smith') ID를 반환하는 값) – orangegoat

+0

@MattBusche 감사합니다. – mduck

답변

5

뭔가는 다음과 같이 작동 나를 위해 selectKey에 대한 (MyBatis로 3)

<insert id="create" parameterType="Project" useGeneratedKeys="true" keyProperty="project.projectId" keyColumn="PROJECT_ID"> 
    INSERT INTO PROJECT (TITLE,DESCRIPTION) 
    VALUES 
    (#{title},#{description}) 
</insert> 

필요를

class User { 
    int userId 
    ... 
} 

<insert id="addUser" useGeneratedKeys="true" keyColumn="user_id" keyProperty="userId"> 
    INSERT INTO user(login, name,...) VALUES(#{login}, #{name},... 
</insert> 
+0

감사. 내가 아직 얻지 못하는 것은 삽입에 의해 반환 된 값을 잡는 방법입니다. Sqlsession.insert()는 삽입 된 행 수 대신이 값을 반환해야합니까? – mduck

+2

내 예제에서 생성 된 키는 User.userId에 다시 저장됩니다. – natros

+0

맞아요 ... 그 사실을 알지 못했습니다 ... thanks – mduck

0

트리거는 id를 얻기 위해 id_seq Oracle 시퀀스를 사용한다고 가정 해 보겠습니다. 동일한 데이터베이스 세션을 사용하여 MyBatis에서 실행하는 경우 SQL

select id_seq.currval from dual; 

사용 된 ID가 표시됩니다. 이 같은

+0

시퀀스에서 현재 값을 선택하기 바로 전에 테이블에 다른 삽입이 수행되면 어떻게됩니까? 내가 새로 생성 된 ID를 얻을 수 있습니까? 아니면 세션을 기반으로 나에게 맞는 것을 주겠습니까? – mduck

+0

세션이 테이블 또는 다른 세션에 삽입하고 있습니까? 그것입니까 너 테이블 삽입; 표 삽입; id_seq.currval; 또는 당신 : 다른 테이블 사람을 삽입 : 테이블 당신에게 삽입 : 첫 번째 시나리오에서는 is_seq.currval 을 id_seq.currval는 두 번째 테이블 ID를 반환합니다. 두 번째 시나리오에서 id_seq.currval은 테이블 삽입을위한 ID를 반환합니다. –

+0

예, 다른 세션에서 삽입 작업을 수행 중일 수 있습니다. – mduck

1

를 작동하지합니다. keyProperty에 올바른 값을 넣으십시오. 시퀀스에서 다음 ID를 얻기 위해 oracle에 삽입하기 전에 트리거가 있습니다.

는 다른 방법이 또한 작동 : 오라클과

<insert id="createEmpty" statementType="CALLABLE" parameterType="Panelist"> 
    BEGIN INSERT INTO PANELIST(PANEL_ID) VALUES (#{panelId}) 
    RETURNING PANELIST_ID INTO 
    #{panelist.panelistId,mode=OUT,jdbcType=INTEGER}; END; 
</insert> 
0

, 더 나은 두 단계를하고있다. 잘 작동하고 가격은 또 하나의 매퍼입니다 :

첫 번째 단계 : 당신은 서열을 얻을

<?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="com.sample.work.dao.SequencerMapper" > 
<select id="selectNextId" resultType="long" > 
select seq_sample.nextval from dual 
</select> 
</mapper> 

, 개체 장소 홀더에 넣고

두 번째 단계 :

삽입하여 객체

관련 문제