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>
💡 사용예시 - 해당 예시는 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를 객체의 특정 프로퍼티에 설정하는 데 사용됩니다.
@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를 반환하였습니다.