MyBatis

<sql>, <include>, <selectKey>

99duuk 2024. 9. 9. 11:01

1. <sql> 

재사용 가능한 SQL 조각을 정의할 때 사용

<sql id="식별자">
    SQL 조각
</sql>

id 속성: SQL 조각을 식별하는 고유한 이름을 지정함

 

<sql id="userColumns">
    id, username, password, email, created_at, updated_at
</sql>

사용자 테이블의 컬럼들을 정의한 SQL 조각 

 

 

  • 여러 쿼리에서 반복적으로 사용되는 컬럼 목록을 한 번에 정의함
  • 이 SQL 조각은 다른 쿼리에서 재사용될 수 있음

 

 


2. <include>

<sql> 태그로 정의된 SQL 조각을 포함시킬 때 사용

<include refid="SQL조각ID" />
  • refid 속성: 포함시킬 SQL 조각의 id를 지정함
<select id="selectUsers" resultType="User">
    SELECT 
        <include refid="userColumns" />
    FROM users
    WHERE status = 'ACTIVE'
</select>

활성 사용자를 조회하는 쿼리

 

 

  • "userColumns"이라는 id를 가진 SQL 조각을 포함시킴
  • 여러 쿼리에서 동일한 컬럼 목록을 재사용할 수 있음
  • SQL의 중복을 줄이고 유지보수성을 향상시킴

3. <selectKey>

데이터베이스에 새로운 레코드를 삽입한 후 자동 생성된 키 값을 가져오거나, 삽입/수정/삭제 전후에 특정 값을 조회

주로 INSERT 쿼리와 함께 사용되지만 UPDATE나 DELETE 쿼리에서도 사용할 수 있음

 

키 생성 시점 지정:

  • order="BEFORE": 메인 SQL 실행 전에 <selectKey> 실행
  • order="AFTER": 메인 SQL 실행 후에 <selectKey> 실행

 

  • 결과 타입 지정:
    • resultType 속성으로 반환될 값의 타입을 지정
  • 키 값 할당:
    • keyProperty 속성으로 생성된 키 값을 할당할 파라미터 객체의 프로퍼티를 지정
  • 데이터베이스 특화 기능:
    • 데이터베이스마다 다른 키 생성 방식을 지원 (예: MySQL의 LAST_INSERT_ID(), Oracle의 SEQUENCE 등)

 

MySQL에서 자동 증가 키 값 가져오기:

 

<insert id="insertEmployee" parameterType="Employee">
    <selectKey keyProperty="id" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT INTO employees (name, position) VALUES (#{name}, #{position})
</insert>

 

 

Oracle에서 시퀀스를 사용해 키 값 미리 생성하기:

<insert id="insertEmployee" parameterType="Employee">
    <selectKey keyProperty="id" resultType="int" order="BEFORE">
        SELECT employee_seq.NEXTVAL FROM DUAL
    </selectKey>
    INSERT INTO employees (id, name, position) VALUES (#{id}, #{name}, #{position})
</insert>

 

 

삽입 전에 특정 값 조회하기:

<insert id="insertEmployee" parameterType="Employee">
    <selectKey keyProperty="departmentCode" resultType="string" order="BEFORE">
        SELECT department_code FROM departments WHERE id = #{departmentId}
    </selectKey>
    INSERT INTO employees (name, position, department_code)
    VALUES (#{name}, #{position}, #{departmentCode})
</insert>

 

 

<selectKey>를 사용하면 별도의 쿼리를 실행하지 않고도 자동 생성된 키 값을 쉽게 가져올 수 있고,

삽입이나 수정 작업 전후에 필요한 값을 조회할 수 있음


 

'MyBatis' 카테고리의 다른 글

계층 쿼리 (중첩 SELECT_mysql, CTE_mysql, CONNECT BY_oracle)  (0) 2024.09.09
@변수명 :=  (0) 2024.09.09
<set>, <where>  (0) 2024.09.09
<if>, <foreach>, <trim>  (0) 2024.09.09
<choose>, <when> , <bind>  (0) 2024.09.09