반응형
해당 글에서는 MyBatis 내에서 Insert를 수행한 이후에 키 값을 바로 반환받는 방법에 대해 알아봅니다.
💡 [참고] MyBatis를 활용하는 방법에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
분류 | 링크 |
MyBatis 환경 설정 방법 | https://adjh54.tistory.com/65 |
MyBatis Query Formatter 설정 방법: log4jdbc-log4j2 | https://adjh54.tistory.com/228 |
MyBatis Insert 이후 키 값 리턴 방법 : SelectKey, useGeneratedKeys, keyProperty | https://adjh54.tistory.com/406 |
MyBatis 중복 쿼리 줄이기 방법 : sql, include, property | https://adjh54.tistory.com/407 |
MyBatis 저장 프로시저 호출 방법: CALL, MyBatis Parameter | https://adjh54.tistory.com/409 |
1) 상황 파악
💡 상황 파악
- MyBatis 내에서 테이블에 값을 INSERT한 이후에 AUTO INCREMENT 된 값을 반환된 ‘키’ 값을 기반으로 다음 테이블을 처리하는 경우가 많이 있습니다. 그렇기에 INSERT 트랜잭션을 수행한 이후에 ‘키’ 값을 반환받는 기능들에 대해 알아봅니다.
- 단, 해당 방법은 테이블 컬럼의 Default 값으로 지정한 값은 반환받을 수 없습니다.
- 해당 기능은 일반적으로 SelectKey 태그나 useGeneratedKeys 속성을 이용하여 구현합니다.
2) SelectKey
💡 SelectKey
- 데이터베이스에서 값을 삽입 또는 업데이트한 후에 그 값을 가져오는 기능을 제공합니다.이는 주로 데이터를 삽입한 후 자동 생성된 기본 키 값을 가져오는 데 사용됩니다.
1. 주요 속성
속성 | 필수/선택 | Default | 설명 | 상세 속성 |
keyProperty | 필수 | None | MyBatis가 생성된 키를 설정할 속성의 이름입니다. | |
resultType | 필수 | None | 생성된 키의 반환 유형입니다. | |
order | 선택 | AFTER | SELECT 키 문이 실행되는 순서를 결정합니다. 'BEFORE' 또는 'AFTER' 중 하나를 선택할 수 있습니다.(Default : AFTER) | - BEFORE : 쿼리가 수행하기 전에 실행 - AFTER : 쿼리가 수행한 이후 실행 |
statementType | 선택 | PREPARED | 키 값을 생성하는데 사용되는 SQL입니다. (default: PREPARED) | - PREPARED:PreparedStatement 객체를 사용하여 SQL문을 실행 - CALLABLE: CallableStatement 객체를 사용하여 SQL문을 실행 - STATEMENT: Statement 객체를 사용하여 SQL문 실행 |
keyColumn | 선택 | None | 결과로 반환된 여러 컬럼 중에서 키를 선택하는 데 사용됩니다. |
[더 알아보기]
💡 statementType 속성 값을 무엇을 사용하는것이 좋을까?
- PREPARED : 이 속성은 특히 동적 SQL을 처리하거나 복잡한 SQL 쿼리를 실행할 때 유용합니다.
- CALLABLE: 이 속성은 주로 데이터베이스 저장 프로시저를 호출할 때 사용됩니다.
- STATEMENT: 이 속성은 간단한 SQL 문을 실행하는 데 주로 사용됩니다.
2. 사용예시 : UserMapper(interface)
@Repository
public interface UserMapper {
int insertUser(UserDto userDto);
}
3. 사용예시 : UserService(interface)
@Service
public interface UserService {
int insertUser(UserDto userDto);
}
4. 사용예시 : UserServiceImpl
💡 파라미터로 보낼때에 DTO와 INSERT 문을 수행한 뒤 DTO를 비교하여 userSq 값을 반환받는지 확인합니다.
@Service
@Slf4j
public class UserServiceImpl implements UserService {
private final SqlSession sqlSession;
public UserServiceImpl(SqlSession ss) {
this.sqlSession = ss;
}
@Override
@Transactional
public int insertUser(UserDto userDto) {
int result = 0;
log.debug("실행 전 ::" + userDto.toString());
UserMapper um = sqlSession.getMapper(UserMapper.class);
result = um.insertUser(userDto);
log.debug("실행 후 ::" + userDto.toString());
return result;
}
}
5. 사용예시-1 : UserMapper.xml - NEXTVAL(시퀀스)를 사용한 예시
💡 사용예시
- 해당 예시는 tb_user 라는 테이블의 데이터를 INSERT 한 후에 selectkey를 통해서 키 값(userSq)을 반환받는 예시입니다.
1. insert 태그에서는 파라미터로 userDto라는 값으로 데이터를 전달 받습니다.
2. INSERT 처리가 되기 이전(BEFORE)에 NEXTVAL(시퀀스) 생성될 시퀀스 값을 조회하여 반환합니다. (* Serial 타입으로 지정
하면 생성과 동시에 시퀀스가 생성이 됩니다)
3. INSERT INTO에서는 AUTO INCREMENT 되는 ‘userSq’ 컬럼을 제외한 값을 insert 합니다
<!-- 사용자 등록 -->
<insert id="insertUser" parameterType="userDto">
<selectKey keyProperty="userSq" order="BEFORE" resultType="int">
SELECT NEXTVAL('tb_user_user_sq_seq') as userSq
</selectKey>
INSERT INTO tb_user(user_id, user_pw, user_nm, user_st)
VALUES (#{userId}, #{userPw}, #{userNm}, #{userSt})
</insert>
💡 [참고] Serial 타입에 대해 궁금하시면 아래의 링크를 참고하시면 도움이 됩니다.
6. 사용예시-2 :UserMapper.xml - LAST_VALUE를 사용한 예시
💡 사용예시
- 해당 예시는 tb_user라는 테이블의 데이터를 INSERT 한 후에 selectkey를 통해서 키 값(userSq)을 반환받는 예시입니다.
1. insert 태그에서는 파라미터로 userDto라는 값으로 데이터를 전달받습니다.
2. INSERT INTO에서는 AUTO INCREMENT 되는 ‘userSq’ 컬럼을 제외한 값을 insert 합니다.
3. INSERT 처리가 된 이후(AFTER)에 시퀀스의 값을 확인하여 반환합니다.
<!-- 사용자 등록 -->
<insert id="insertUser" parameterType="userDto">
<selectKey keyProperty="userSq" order="AFTER" resultType="int">
SELECT LAST_VALUE FROM public.tb_user_user_sq_seq
</selectKey>
INSERT INTO tb_user(user_id, user_pw, user_nm, user_st)
VALUES (#{userId}, #{userPw}, #{userNm}, #{userSt})
</insert>
7. 결과 확인
💡 아래와 같이 실행 후에 userSq로 INSERT 과정에 생성된 userSq를 반환하였습니다.
3) useGeneratedKeys, keyProperty 속성
💡 useGeneratedKeys 속성
- MyBatis에서 자동 생성된 키를 사용할지 여부를 결정하는 속성입니다.
- 속성을 true로 설정하면, MyBatis는 PreparedStatement.getGeneratedKeys 메서드를 사용하여 데이터베이스에서 생성된 키를 검색합니다.
- 이는 일반적으로 새로 삽입된 레코드의 ID를 가져오는 데 사용됩니다.
💡 keyProperty 속성
- MyBatis에서 생성된 키를 어느 프로퍼티에 설정할지를 결정하는 속성입니다.
- 속성을 설정하면, MyBatis는 생성된 키를 해당 프로퍼티에 자동으로 설정합니다.
- 이는 일반적으로 새로 삽입된 레코드의 ID를 객체의 특정 프로퍼티에 설정하는 데 사용됩니다.
1. INSERT 태그 속성
속성 | 설명 |
id | SQL문의 식별자 |
parameterType | SQL문의 파라미터 타입 |
keyProperty | 자동 생성된 키를 설정할 프로퍼티의 이름 |
keyColumn | 자동 생성된 키가 있는 컬럼의 이름 |
useGeneratedKeys | JDBC의 자동 생성된 키를 사용할지 여부(default: false) |
statementType | STATEMENT, PREPARED, CALLABLE 중 하나를 지정 |
2. 사용예시 : UserMapper(interface)
@Repository
public interface UserMapper {
int insertUser(UserDto userDto);
}
3. 사용예시 : UserService(interface)
@Service
public interface UserService {
int insertUser(UserDto userDto);
}
4. 사용예시 : UserServiceImpl
💡 파라미터로 보낼 때에 DTO와 INSERT 문을 수행한 뒤 DTO를 비교하여 userSq 값을 반환받는지 확인합니다.
@Service
@Slf4j
public class UserServiceImpl implements UserService {
private final SqlSession sqlSession;
public UserServiceImpl(SqlSession ss) {
this.sqlSession = ss;
}
@Override
@Transactional
public int insertUser(UserDto userDto) {
int result = 0;
log.debug("실행 전 ::" + userDto.toString());
UserMapper um = sqlSession.getMapper(UserMapper.class);
result = um.insertUser(userDto);
log.debug("실행 후 ::" + userDto.toString());
return result;
}
}
5. 사용예시-2 :UserMapper.xml
💡 사용예시
- insert 태그 내에 useGeneratedKeys 속성을 true로 사용하고 keyProperty 속성을 Auto Increment로 생성된 컬럼의 값으로 매핑하였습니다. 이를 통해 insert를 수행한 이후에 userSq 값으로 반환받습니다.
<!-- 사용자 등록 -->
<insert id="insertUser" useGeneratedKeys="true" keyProperty="userSq">
INSERT INTO tb_user(user_id, user_pw, user_nm, user_st)
VALUES (#{userId}, #{userPw}, #{userNm}, #{userSt})
</insert>
6. 결과 확인
💡 결과 확인
- 아래와 같이 실행 후에 userSq로 INSERT 과정에 생성된 userSq를 반환하였습니다.
오늘도 감사합니다. 😀
반응형
'Java > MyBatis' 카테고리의 다른 글
[Java] MyBatis 연산자 이해하기 : 비교, 사칙, 비트, 시프트 연산자, CDATA (1) | 2024.02.17 |
---|---|
[Java] MyBatis 이해하기 -1 : 공통 파라미터 종류, select, insert, update, delete (0) | 2024.02.03 |
[Java] MyBatis에서 저장 프로시저(Stored Procedure) 호출 방법 : CALL, MyBatis Parameter (2) | 2024.01.27 |
[Java] MyBatis에서 중복 쿼리 줄이기 사용방법 : sql, include, property (0) | 2024.01.27 |
[Java] MyBatis Query Formatter 이해하고 적용하기 : log4jdbc-log4j2 4.1 (0) | 2023.07.26 |