본문 바로가기

디버깅/Spring mvc (Maven, Mybatis)

[Mybatis] insert, update 후 row의 column 값 return받기

반응형

그동안-_- 이걸 모르고 어떻게 개발했나 부끄럽지만.. 이제서야 알게 되었다. 

row를 insert하거나 update하면 그 row의 index값을 컨트롤러에서 사용해야 할때가 있다.


하지만 보통의 index는 auto increment 하거나, Oracle에선 sequence를 이용해서 값을 부여하기 때문에 insert되기 전까지 row의 index를 판별할 수가 없다. 

sqlsession에서 insert()에 리턴이 있고.. 메소드를 자세히 읽어보면 selectKey라는걸 리턴받을 수가 있는데 (이걸 쓰면서 처음 읽어본 내 자신에게 반성을..) 

이 selectKey라는건 컬럼을 직접 지정해주면 되고.. 지정하면 리턴받을 수 있다. 대략 그것에 대한 설명이 되겠다.


1. insert 태그에  property를 추가해주자, keyProperty는 리턴받을 컬럼명을 적어주면 된다.

useGeneratedKeys="true" keyProperty="id"

1-1.  태그 하단에 property를 추가하면 대략 이런 모습이다. (내 프로젝트 (MySQL)에서 동작하는 SQL인데 Mybatis 튜토리얼과 조금 다르다.)

<insert id="insertAuthor" useGeneratedKeys="true" keyProperty="id"> insert into Author (id, username, password, email,bio, favourite_section) values (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR}) </insert>

Author를 insert하는 쿼리 메소드이다. 이렇게 된다면 insert하고 난뒤  해당 row의 id컬럼값을 selectKey로 리턴받을 수 있게 된다.


2. DAOImpl에서 해당 컬럼의 값을 리턴받을 수 있다.


3. 아마도 예시 코드는 이런식이 되지 않을런지..(DAOImel)

1
2
3
4
5
    @Override
    public int insertAuthor(AuthorVO author) throws Exception {
        int insertId = sqlSession.insert(Namespace+".insertAuthor", author);
        return insertId;
    }
cs


MySQL에서는 selectKey태그를 이용하면 값을 리턴해주지 않았는데. 

Oracle에서는 selectKey태그를 사용해야 할 수도 있다. (확인필요)




참고 출처:

https://taetaetae.github.io/2017/04/04/mybatis-useGeneratedKeys/

http://www.mybatis.org/mybatis-3/ko/sqlmap-xml.html

반응형