쿼리문을 작성하다보면 반복되는 문장이 많다.
이 반복되는 문장을 따로 빼놓고 갖다 쓸 수 있는 게 <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 |