spring
MyBatis <sql>과 <include> 정리
에취~H
2022. 7. 24. 20:23
반응형
spring mapper xml파일을 작성할 때, 반복되는 문구에 대해 고민한 적이있다.
회사에서 받은 소스의 mapper XML파일은 공통으로 들어가는 조인 구문이 있었다.
잘못된 쿼리로 인해 반복되는 쿼리의 문구를 수정해야된다면, 이클립스에서 ctrl + f를 통해 일일이 찾아 수정해주어야했다.
이럴 때, 필요한 MyBatis문법이 <sql>과 <include>이다.
<sql> 태그에 id를 주어 DML에 삽입할 수 있다.
<sql id = "exampleSub">
SELECT A.VALUE
FROM TEMP.TABLE1 A
INNER JOIN TEMP.TABLE2 B
ON A.COLUMN = B.COLUMN
AND A.COLUMN2 = B.COLUMN2
INNER JOIN TEMP.TABLE3 C
ON A.COLUMN = C.COLUMN
AND A.COLUMN2 = C.COLUMN2
</sql>
id가 exampleSub sql 조각을 <include>태그로 불러와서 사용할 수 있다.
<select id = "sample" resultType = "java.util.HashMap">
SELECT *
FROM TEMP.MAIN
WHERE VALUE IN (
<include refid="exampleSub">
</include>
)
</select>
주의점으로는 <sql>태그는 <include>보다 상단에 선언되어야한다.
추가적으로
<include>태그에서 <property>를 통해 <sql>태그로 파라미터를 넘길 수 있다.
<sql id="userColumns">
${alias}.id,
${alias}.username,
${alias}.password
</sql>
<select id = "sample2" resultType = "java.util.HashMap">
SELECT
<include refid="userColumns"><property name="alias" value="t1"/></include>,
<include refid="userColumns"><property name="alias" value="t2"/></include>
FROM TABLE1 t1
CROSS JOIN TABLE2 t2
</select>
<sql>태그에서 ${}를 통해 파라미터를 넘겨준다. 좀 더 동적으로 사용할 수 있다.
<sql>태그와 <include>태그를 통해 쿼리의 반복성을 제거하고
쿼리의 재사용을 높일 수 있었다.
반응형