재채기는 H

MyBatis <sql>과 <include> 정리 본문

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>태그를 통해 쿼리의 반복성을 제거하고

쿼리의 재사용을 높일 수 있었다.

반응형
Comments