MyBatis에서 자주 사용하는 주요 기능을 공식 메뉴얼이 제공하는 예제를 통해 간단히 정리해보자.
● MyBatis 공식 메뉴얼: https://mybatis.org/mybatis-3/ko/index.html
● MyBatis 스프링 공식 메뉴얼: https://mybatis.org/spring/ko/index.html
동적 SQL
마이바티스가 제공하는 최고의 기능이자 마이바티스를 사용하는 이유는 바로 동적 SQL 기능 때문이다. 동적 쿼리를 위해 제공되는 기능은 다음과 같다.
● if
● choose (when, otherwise)
● trim (where, set)
● foreach
공식 메뉴얼에서 제공하는 예제를 통해 동적 SQL을 알아보자
if
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
● 해당 조건에 따라 값을 추가할지 말지 판단한다.
● 내부의 문법은 OGNL을 사용한다. 자세한 내용은 OGNL을 검색해보자.
choose, when, otherwise
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
● 자바의 switch 구문과 유사한 구문도 사용할 수 있다.
trim, where, set
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG
WHERE
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
이 예제의 문제점은 문장을 모두 만족하지 않을 때 발생한다.
SELECT * FROM BLOG
WHERE
title 만 만족할 때도 문제가 발생한다.
SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’
결국 WHERE 문을 언제 넣어야 할지 상황에 따라서 동적으로 달라지는 문제가 있다.
<where> 를 사용하면 이런 문제를 해결할 수 있다.
<where> 사용
<select id="findActiveBlogLike" resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
<where> 는 문장이 없으면 where 를 추가하지 않는다. 문장이 있으면 where 를 추가한다. 만약 and 가 먼저 시작된다면 and 를 지운다.
참고로 다음과 같이 trim 이라는 기능으로 사용해도 된다. 이렇게 정의하면 <where> 와 같은 기능을 수행한다.
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
foreach
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
<where>
<foreach item="item" index="index" collection="list"
open="ID in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</where>
</select>
● 컬렉션을 반복 처리할 때 사용한다. where in (1,2,3,4,5,6) 와 같은 문장을 쉽게 완성할 수 있다.
● 파라미터로 List 를 전달하면 된다.
참고
동적 쿼리에 대한 자세한 내용은 다음을 참고하자.
https://mybatis.org/mybatis-3/ko/dynamic-sql.html
출처 : 김영환 스프링 DB2 강의
'데이터 접근 기술 > MyBatis' 카테고리의 다른 글
MyBatis - Mapped Statements collection does not contain value for~ 에러 (0) | 2022.10.02 |
---|---|
MyBatis 기능 정리2 - 기타 기능 (0) | 2022.08.17 |
MyBatis 적용3 - 분석 (0) | 2022.08.16 |
MyBatis 적용2 - 설정과 실행 (0) | 2022.08.16 |
MyBatis 적용1 - 기본 (0) | 2022.08.16 |