[MyBatis] 개발 생산성 향상,중복 쿼리 줄이기 sql, include 개념 및 문법 총 정리

2022-03-01
  • 개념

다른 구문에서 재사용하기 위한 SQL 조각

출처 : mybatis 공식 사이트

말 그대롭니다. “재사용성을 높이기 위한 SQL 조각” 아주 정확한 표현입니다.

  • 조건

1.id 속성 값이 필수입니다.

2.사용하려는 태그보다 먼저 선언되어야 합니다.(위에 존재해야 합니다.)

  • 문법
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
 
<include> 

<property>
  • 개념

sql 문을 DML(Data Manipulation Language) 태그에 삽입하는 기술

  • 문법
<select,insert,update,delete>

  <include refid="<sql> id"><property name="<sql> property" value=""/></include>

</select,insert,update,delete>
<sql> + <include><property> 설명
sql
//no property 
<sql id="example01">
  FROM
</sql>

//property 한개 작성
<sql id="example02">
  FROM ${alias(별칭)}
</sql>

//property 여러 개 작성
<sql id="example03">
  FROM ${alias(별칭)} WHERE id = ${alias02(별칭)}
</sql>
<select id="selectUser" resultType="User">
SELECT id,name
  <include refid="example03">
    <property name="alias" value="tablename"/>
    <property name="alias02" value="119"/>
  </include>
</select>
  • 실행될 쿼리
SELECT id,name FROM tablename WHERE id = 119
  • 설명
0.<sql> 문에는 parameter를 넘길 수 없으므로 property를 사용한다. ex) ${alias},${tablename}..

1.<sql> id 속성 == <include> refid 속성

2.<sql> ${alias(별칭)} == <property> name 속성  

3.<property> value 속성 : ${alias}에 들어갈 값

이 네가지만 기억하시면 됩니다.

<sql> + <include> 실전 예제
☞ 참고 : <sql> property는 꼭 $로 작성하셔야 합니다.

☞ 참고 02 : <sql> 문에선 property 를 <if> , <bind> 태그에 변수로 인식하지 못합니다.

1.Table 문법 재사용

sql
<sql id="returnTable">
  from ${tableproperty}
</sql>
<include refid="returnTable">
  <property name="tableproperty" value="tablename"/>
</include>

2.JOIN문 활용 (MyBatis 공식 사이트 예제)

sql
<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>
<select id="selectUsers" resultType="map">
  select
    <include refid="userColumns"><property name="alias" value="t1"/></include>,
    <include refid="userColumns"><property name="alias" value="t2"/></include>
  from some_table t1
    cross join some_table t2
</select>

3.SELECT 칼럼 문법 재사용

sql
<sql id="common_select_table">id, name, age</sql>
<select id="getMemberInfo">
    SELECT
        <include refid="common_select_table" />
      FROM TABLE
</select>

4.INSERT 문 활용

sql
<sql id="board_columns">
    ${alias}id,
    ${alias}subject,
    ${alias}context,
    ${alias}attachments,
    ${alias}likes,
    ${alias}views,
    ${alias}create_time,
    ${alias}update_time,
    ${alias}writer
</sql>
sql
<insert id="insertBoard">
    INSERT INTO BOARD (
           <include refid="board_columns"><property name="alias" value=""/></include>
         ) VALUES (
          #{id},
          #{subject},
          #{context},
          #{attachments},
          #{likes},
          #{views},
          now(),
          null,
          #{writer} )
</insert>
외부 SQL-Mapper.xml + <include> 사용하기 

board-Mapper.xml 에서 common-Mapper.xml <sql> 사용(접근) 하기

common-Mapper.xml

sql
<mapper namespace="mapper.common-Mapper">

<sql id="board_col">
${alias}id,
${alias}subject,
${alias}context
</sql>

</mapper>

board-Mapper.xml

sql
<select id="selectUser">
    SELECT <include refid="mapper.common-Mapper.board_col">
    <property name="alias" value="b."/></include>
      FROM board b
</select>
  • 설명
사용 할 외부 Mapper.xml에 namespace.<sql> id로 가져오면 됩니다.

출처: https://java119.tistory.com/90?category=824525