Dynamic SQL ( 동적 SQL)

DeadWhale·2022년 6월 30일
0

Spring

목록 보기
16/25
post-thumbnail

mybatis에서 자랑하는 가장 강력한 기능

동적 SQL : mybatis의 가장 강력한 기능

이전에는 게시글 작성 시
먼저 다음 게시글의 시퀀스 번호를 SELECT해 온 후 변수에 저장한 다음
그 번호를 가지고 다시 한번 DAO를 수행해야 했다

이러한 두번의 Service <-> DAO 수행을 한번의 동작으로 해결 할 수있다

SELECT KEY

<!-- useGeneratedKeys 속성 : DB 내부적으로 생성한 키(시퀀스)를 받는 JDBC 메서드를 사용하도록 설정한다 
  (default : false) 동적 SQL <SELECT KEY> 
- 동적 SQL : SQL 수행 되는 중 수행되는 중에 IF/FOR문 등을 이용해 SQL을 변경하는 기능 ( mybatis의 가장 강력한 기능 ) 
- <selectKey> : Insert / Update에  사용되는 키(ex.시퀀스)를 원하는 변수/필드에 담아서 반환하는 태그 
- keyProperty : key를 담을 변수 / 필드를 지정하는  속성 
- order : INSERT / UPDATE 작성된 메인 SQL이 수행되기 전(BEFORE) 또는 후(AFTER)에 <selectKey>내부 
  SQL이 수행되도록 순서를 지정하는 속성 -->
<insert id="insertBoard" parameterType="detail"
        useGeneratedKeys="true">

  <!-- 자동으로 detail 요소에 조회된 시퀀스 값이 boardNo 들어온다. -->
  <selectKey keyProperty="boardNo" resultType="_int"
             order="BEFORE">
    SELECT SEQ_BOARD_NO.NEXTVAL FROM DUAL
  </selectKey>


  INSERT INTO BOARD VALUES(
  #{boardNo},#{boardTitle},#{boardContent},
  default,default,default,default,
  #{memberNo},#{boardCode})
</insert>

순서
1. selectKey으로 조회된 다음 시퀀스 번호를 Inser태그에 작성한 ParameterType="detail" 에 boardNo에 매치 시킨다
2. 그후 INSERT 태그 내부의 boardNo

INSERT 태그 내부에 SELECT 태그가 있는데 설명은 위에 적혀있다
이게 진짜 무쳤다 여기까지 앝은 복사 적용된다
현재 Parameter로 넘어온 detail은 얕은복사의 의미가 되어
여기서 세팅된 순간 DAO , Service , Controller에서 다 사용 가능하다


  <!-- 게시글 이미지삽입 [ 리스트로 ] -->
  <!-- boardMapper.insertBoardImageList -->

<!-- 동적 SQL 중 <foreach>(다소문자) 반복문 - 특정 SQL 구문을 반복할 때 사용 - 반복되는 사이에 구분자 (separator)를 추가할 수있다

collection 반복할 객체의 타입 (list , set , map...등등) 
item : collection에서 순차적으로 꺼낸 하나의 요소를 저장하는 변수 
index : 현재 반복접은 중인 0,1,2,3 반복문에서 i같은거 
opne : 반복전에  출력할 sql 
close : 반복 종료후에 출력할 sql 
separator : 반복 사이사이 구분자. 
-->

<insert id="insertBoardImageList" parameterType="list">
    INSERT INTO BOARD_IMG
    SELECT SEQ_IMG_NO.NEXTVAL IMG_NO,A.* FROM(
    <foreach collection="list" item="img" separator="UNION ALL">
      SELECT
      #{img.imageReName} IMG_RENAME,
      #{img.imageOriginal} IMG_ORIGINAL,
      #{img.imageLevel} IMG_LEVEL,
      #{img.boardNo} BOARD_NO
      FROM DUAL
    </foreach>
    )A
  </insert>

내가 아는 foreach 문이랑 거의 동일하다
단, 이 때 forEach가 아니라 전부 소문자로 작성해야 한다 (foreach)
Collection은 List형태로 들어오니깐 mybatis 별칭으로 지정
하나씩 꺼내서 img라고 명명하겟다
반복하면서 UNION ALL이라는 구분자를 넣겟다
라는 생각보다 단순한 코드이다 개꿀인듯


동적 SQL은 여러 기능을 가지고 있는거 같다
오늘 배운 기능

  • 게시글 삽입 시 시퀀스를 따로 조회하는 selectKey
  • 여러번의 INSERT를 한번의 INSERT로 하는 법

0개의 댓글