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 |