_yoonie
개발일기
_yoonie
전체 방문자
오늘
어제
  • 분류 전체보기 (70)
    • 개발일기 (2)
    • DB (8)
      • MySQL (2)
      • PostgreSQL (6)
    • WEB (30)
      • JAVASCRIPT (7)
      • Vue.js (2)
      • MyBatis (3)
      • PHP (7)
      • HTML_CSS (5)
      • etc. (3)
    • Java (9)
    • Android (5)
    • Kotlin (0)
    • C# (3)
    • Python (2)
    • 개발 툴 (5)
    • 기획 (1)
    • 자료실 (2)
    • React (0)

인기 글

태그

  • 기획
  • PostgreSQL
  • ubuntu
  • VirtualBox
  • c#
  • java programming
  • CSS
  • 안드로이드스튜디오
  • androidstudio
  • Java

최근 댓글

최근 글

티스토리

160x600
hELLO · Designed By 정상우.
_yoonie

개발일기

[MyBatis] <sql>, <include> 사용하기
WEB/MyBatis

[MyBatis] <sql>, <include> 사용하기

2022. 9. 2. 10:17

쿼리문을 작성하다보면 반복되는 문장이 많다.

이 반복되는 문장을 따로 빼놓고 갖다 쓸 수 있는 게 <sql>, <include>다.

 

공통으로 빼는게 <sql> , 갖다 쓰는 게 <include>

 

# <sql> <include> 사용하기

1. 기본 문법

<!--StudentMapper.xml-->
<mapper namespace="Student">
    <sql id="baseInfoColumn">
        A.id, A.name, A.grade
    </sql>

    <select id="studentList">
        SELECT 
        <include refid="baseInfoColumn"></include>
        FROM TB_STUDENT A
    </select>

    <!-- 결과 -->
    SELECT A.id, A.name, A.grade
    FROM TB_STUDENT A


    <select id="scoreList">
        SELECT 
        <include refid="baseInfoColumn"></include>
               , B.score
        FROM TB_STUDENT A
        JOIN TB_SCORE B
          ON A.id = B.student_id
    </select>

    <!-- 결과 -->
        SELECT A.id, A.name, A.grade
               , B.score
        FROM TB_STUDENT A
        JOIN TB_SCORE B
          ON A.id = B.student_id

</mapper>

indent 안맞는거 킹받네.. 작성한대로 나오게하는 방법 없나

 

2. 다른 Mapper의 <sql>을 사용할 경우

<include refid="namespace.id"> 로 사용

<!--TeacherMapper.xml-->
<mapper namespace="Teacher">

    <sql id="baseInfoColumn">
        TC.id, TC.name
    </sql>

    <select id="teacherList">
        SELECT 
        <include refid="baseInfoColumn"></include>
        ,
        <include refid="Student.baseInfoColumn"></include>
        FROM TB_TEACHER TC
        JOIN TB_STUDENT A
          ON A.teacherId = TC.id
    </select>

</mapper>


<!-- 결과 -->
    SELECT TC.id, TC.name
           , A.id, A.name, A.grade
    FROM TB_TEACHER TC
    JOIN TB_STUDENT A
      ON A.teacherId = TC.id

 

3. <include>에서 인수 넘겨서 <sql>에서 사용하기

함수처럼 <include> 에서 인수를 넘겨 사용할 수도 있다.

<sql id="selectTeacher">
		${ALIAS}.name
        
	<!-- <if test="${ISSET} == true"> // 오류!-->
    <if test="ISSET == true">
    	, ${ALIAS}.${COLUMN}
    </if>
</sql>

<select>
	SELECT A.name
    	   ,
    <include refid="selectTeacher">
    	<property name="ALIAS" value="TC"></property>
        <property name="ISSET" value="false"></property>
        <property name="COLUMN" value="id"></property>
    </include>
    FROM TB_STUDENT A
    JOIN TB_TEACHER TC
      ON A.teacher_id = TC.id
</select>

<!-- 결과 -->
SELECT A.name
	   ,TC.name
  FROM TB_STUDENT A
  JOIN TB_TEACHER TC
    ON A.teacher_id = TC.id

 

# 발생할 수 있는 오류

1. <sql> 안의 <if>절에 변수를 잘못 표기하여 사용할 경우

nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression ... Cause: org.apache.ibatis.ognl.ExpressionSyntaxException: Malformed OGNL expression: ...

 

👉 <if> 안에 변수를 사용할 경우, ${}로 감싸줄 필요 없이 <if> 사용하듯 변수명만 작성

 

 

예제 만드는거 어렵다..

728x90

'WEB > MyBatis' 카테고리의 다른 글

[MyBatis] #{}과 ${}의 차이  (0) 2023.06.15
[MyBatis] 오류: java.util.LinkedHashMap cannot be cast to java.lang.String  (0) 2023.06.13
    _yoonie
    _yoonie
    일상이 개발인 개발자의 일상

    티스토리툴바