일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 페이징
- jquery
- 상속예제
- 자바
- 전체텍스트
- 야구게임
- while
- 25가지 효율적인 sql작성법
- Login with OAuth Authentication
- 이클립스
- Random
- 다운캐스팅
- angular2
- full text indexing
- 가변인자
- Full text
- 상속
- 단축키
- 추상클래스
- 전체
- IBatis procedure
- 업캐스팅
- 다형성
- 형변환
- Validations
- 자바 야구게임
- 전자정부
- 스프링
- 로또
- Today
- Total
nalaolla
INSERT 후 시퀀스값 SELECT하기(MySQL,MS-SQL,ORACLE) 본문
선은 테스트 테이블을 생성 해보도록 하자
테이블명은 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 무관하게 결과는 모두 동일하게 나올것이다.
'MyBatis' 카테고리의 다른 글
ibatis 또는 mybatis를 통하여 취한 oracle CLOB데이터를 String으로 풀기 (0) | 2016.04.11 |
---|---|
myBatis 파라미터 바인딩시 주의점 (0) | 2016.03.28 |
parameterType HashMap 관련 예시(다중파라미터) (0) | 2016.03.27 |
마이바티스(MyBatis) 쿼리 로그 출력 및 정렬하기 (0) | 2016.03.27 |
프로시저 호출하기(오라클, SqlServer) (0) | 2016.03.26 |