동적쿼리를 어떻게 판단할까?에 이은 동적쿼리를 어떻게 생성하는지를 알아보겠습니다.
어떻게 판단하는지는 아래 게시물에 나와있으니 참고 부탁드립니다.
아래와 같은 동적쿼리가 있을 때 어떻게 동작하는지 알아보도록 하겠습니다.
<select id="selectTest" parameterType="java.util.Map" resultType="hashmap">
select
id, col1, col2, col3
from dynamic_query
<where>
<if test="test1 != null">
col1=#{test1}
</if>
<if test="test2 != null">
AND col2=#{test2}
</if>
<if test="test3 != null">
AND col3=#{test3}
</if>
</where>
</select>
1. select
첫번째로는 쿼리를 실행한다고 알려줍니다.
2. DefaultSqlSession.selectList
현재 실핼하려고 하는 쿼리의 정보를 가져와서 MappedStatement 변수에 담아줍니다.
그리고 현재 등록되어있는 executor 객체의 query 메소드를 실행합니다.
3. BaseExecutor.query
query 메소드안에서 MappedStatement객체의 getBoundSql 메소드를 실행합니다.
4. MappedStatement.getBoundSql
getBoundSql 메소드안에서 현재 등록되어있는 SqlSource의 getBoundSql 메소드를 실행합니다.
이 때 SqlSource는 동적쿼리라면 DynamicSqlSource 아니라면 RawSqlSource를 가지게 됩니다.
5. DynamicSqlSource.getBoundSql
SqlNode의 apply 메소드를 실행합니다.
이때 MixedSqlNode 객체의 apply가 실행됩니다.
6. MixedSqlNode.apply
현재 가지고 있는 SqlNode들의 apply를 실행합니다.
동적쿼리라면 IfSqlNode 객체를 가지고 있을겁니다.
IfSqlNode.apply를 실행합니다.
7. IfSqlNode.apply
이 부분이 핵심로직입니다.
sql에서 test안에 넣었던 조건이 일치하면 추가하고 true를 리턴하고 일치하지않으면 아무것도 추가하지 않은채 false를 리턴합니다.
지금까지 동적쿼리를 어떻게 만드는지 알아보았습니다.
'개발 > JAVA' 카테고리의 다른 글
[JAVA] Spring Controller를 직접 만들어보자 (1) - 프로젝트 생성 (0) | 2021.01.12 |
---|---|
[JAVA] Parameter name arg0이 나올 때 (0) | 2021.01.10 |
[Mybatis] Mybatis는 어떻게 동적쿼리인지 판단할까? (0) | 2020.12.31 |
[Mybatis] StatementType (0) | 2020.12.28 |
[Mybatis] 쿼리를 어떻게 실행하는 것일까? (0) | 2020.12.28 |
댓글