관리 메뉴

nalaolla

INSERT 후 시퀀스값 SELECT하기(MySQL,MS-SQL,ORACLE) 본문

MyBatis

INSERT 후 시퀀스값 SELECT하기(MySQL,MS-SQL,ORACLE)

날아올라↗↗ 2016. 4. 4. 23:11
728x90

선은 테스트 테이블을 생성 해보도록 하자 


테이블명은 DBMS와 무관하게 동일하게 잡도록 해보겠음


테이블명 : seq_test


컬럼명 

타입 

 idx

bigint or number 

 title

varchar(20) 



MySQL 테이블 생성


CREATE TABLE seq_test(

  idx bigint primary key auto_increment,
  title varchar(20)
)


MS-SQL 테이블 생성



CREATE TABLE seq_test(
  idx bigint IDENTITY(1,1) primary key ,
  title varchar(20)
)  



ORACLE 테이블 생성 (별도의 시퀀스 생성 필요)


CREATE TABLE seq_test(
  idx number primary key ,
  title varchar(20)
);
create sequence idx_test_seq
  start with 1
  increment BY 1
  maxvalue 10000;

테이블을 생성 하였다면 임의의 controller,dao,vo를 생성해보도록 하자


VO


public class Test {
	private int idx;
	private String title;
	
	
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public int getIdx() {
		return idx;
	}
	public void setIdx(int idx) {
		this.idx = idx;
	}
}

CONTROLLER


@Autowired
private Dao dao;
	
@RequestMapping(value="/insertSelectSeq")
public void insertSelectSeq(Test test) {
		try {
			test.setTitle("insert test");
			System.out.println("등록전 idx 값 :"+test.getIdx());
			dao.insertSelectSeq(test);
			System.out.println("등록후 idx 값 :"+test.getIdx());
		} catch (Exception e) {
			e.printStackTrace();
		}
}

DAO


@Autowired
private SqlSession sql;
	
public int insertSelectSeq(Test test) throws SQLException {
	return sql.insert("sql.insertSelectSeq",test);
}

위의 소스에서 보다시피 dao에서는 int 형으로 return을 주지만 

컨트롤러에서는 별도로 받는 vo객체가 존재하지 않는다.

그냥 dao에 parameter로 넘겨준 test객체에 담기는 것이다.


DBMS별로 INSERT 후 시퀀스값을 SELECT 해오는방법중 본인은 2가지 방식을 설명 

하도록 하겠음


1. MySQL, MS-SQL 처럼 시퀀스가 자동 증가인 DBMS일 경우

   사용가능


<insert id="insertSelectSeq" parameterType="com..model.Test" useGeneratedKeys="true" keyProperty="idx">
INSERT INTO seq_test (title)
                    VALUES(#{title})
</insert>

위 코드처럼 정해주면 된다

※ keyProperty는 vo에 정의해준 변수명이다.

    (시퀀스 컬럼값과 일치 시켜줘야함)


그럼 위의 코드로 테스트를 해보도록 하자 

본인은 MySQL로 진행을 해보도록 하겠음


실행결과


위의 결과처럼 INSERT 호출전 VO객체의 들어있던 idx 의 값은 0이었으나 INSERT 처리를 한 후에는 

자동증가값이 들어가있는 것을 확인 하였다.


2. 오라클처럼 시퀀스를 별도록 등록해주어야 하는 경우

   ※ 해당 방법은 꼭 오라클이 아니고 MySQL,MS-SQL 

      모두 사용이 가능 한 방법이다



<!--oracle-->
<insert id="insertSelectSeq" parameterType="com.model.Test">
	INSERT INTO seq_test(idx,title)
		 VALUES(idx_test_seq.nextval,#{title})
	<selectKey keyProperty="idx" resultType="Integer" order="AFTER">
		SELECT idx_test_seq.currval FROM dual
	</selectKey>
</insert>

<!--mysql-->
<insert id="insertSelectSeq" parameterType="com.model.Test">
	INSERT INTO seq_test(title)
		 VALUES(#{title})
	<selectKey keyProperty="idx" resultType="Integer" order="AFTER">
		SELECT LAST_INSERT_ID()
	</selectKey>
</insert>

<!--mssql-->
<insert id="insertSelectSeq" parameterType="com.model.Test">
	INSERT INTO seq_test(title)
		 VALUES(#{title})
	<selectKey keyProperty="idx" resultType="Integer" order="AFTER">
		SELECT IDENT_CURRENT('seq_test')       
	</selectKey>
</insert>

DBMS 종류별로 각각의 Mybatis의 쿼리XML은 위와 같다.


※ MS-SQL 버전에서의 IDENT_CURRENT('seq_test') 의 

    seq_test는 insert했던 테이블 명을 적어주면 된다


그럼 위의 코드로 테스트를 해보도록 하자 

본인은 오라클로 진행을 해보도록 하겠음 


실행결과




위와같이 결과가 나왔다. 

DBMS 무관하게 결과는 모두 동일하게 나올것이다.

728x90