1. selectKey

selectKey 태그는 현재 테이블에 저장되는 데이터의 기본키값을 획득하기 위한 용도로 사용되는 태그이다. 테이블에 저장되는 기본키 값이 다른 테이블의 데이터를 추가할 때 필요한 경우, <selectKey /> 태그를 사용해 값을 획득하고 parameterType으로 지정된 객체의 멤버변수에 저장한다.

selectKey 태그의 속성

  • keyProperty: selectKey 구문의 결과가 저장되는 프로퍼티(멤버변수)
  • resultType: 결과의 타입
  • order: BEFORE / ARTER를 허용한다. BEFORE로 설정하면 selectKey 구문이 먼저 실행되고, 그 후에 다음 쿼리가 실행된다.

2. 사용 예시

1. VO, DTO 구성

public class BookPicture {

	private int bookNo;
	private String picture;

    // constructor, getter/setter 생략
}
public class Book {

	private int no;
	private String title;
	private String author;
	private String publisher;
	private int price;
	private int discountPrice;
	@JsonFormat(pattern = "yyyy년 M월 d일")
	private Date pubDate;
	private int stock;
	@JsonFormat(pattern = "yyyy년 M월 d일")
	private Date updatedDate;
	@JsonFormat(pattern = "yyyy년 M월 d일")
	private Date createdDate;

    // constructor, getter/setter 생략
}
public class BookDetailDto {
	private int no;
	private String title;
	private String author;
	private String publisher;
	private int price;
	private int discountPrice;
	@JsonFormat(pattern = "yyyy년 M월 d일")
	private Date pubDate;
	private int stock;
	@JsonFormat(pattern = "yyyy년 M월 d일")
	private Date updatedDate;
	@JsonFormat(pattern = "yyyy년 M월 d일")
	private Date createdDate;
	private List<BookPicture> BookPictures;

    // constructor, getter/setter 생략
}


2. 책 정보와 책 사진을 insert하는 sql 구현

  • void insertBook(Book book) / void insertBookPicture(Bookpicture bookPicture)
  • selectKey 구문에서 실행된 값은 Book 객체의 프로퍼티인 no에 저장된다. inserBook 구문이 실행된 후 book.getNo()로 값을 얻을 수 있다.
    <insert id="insertBook" parameterType="com.sample.vo.Book">
        <selectKey keyProperty="no" resultType="int" order="BEFORE">
            select books_seq.nextval
            from dual
        </selectKey>
        insert into sample_spring_books
        (book_no, book_title, book_author, book_publisher, book_price, book_discount_price, book_pub_date, book_stock)
        values
        (#{no}, #{title}, #{author}, #{publisher}, #{price}, #{discountPrice}, #{pubDate}, #{stock})
    </insert>

	<insert id="insertBookPicture" parameterType="com.sample.vo.BookPicture">
		insert into sample_spring_book_pictures
		(book_no, book_picture)
		values
		(#{bookNo}, #{picture})
	</insert>


3. service 구현

    public void addNewBook(Book book, List<BookPicture> bookPictures) {
        bookDao.insertBook(Book);

        for (BookPictures picture : bookPictures) {
            picture.getNo(book.getNo());
            bookDao.insertBookPicture(picture);
        }
    }

Controller 코드는 링크 하단에서 확인 가능합니다.