마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 애너테이션을 사용하여 저장 프로시저나 SQL 문으로 객체들을 연결한다.
마이바티스의 가장 강력한 기능 중 하나는 동적 SQL을 처리하는 것이다.
1.if
2.foreach
3.choose(when, otherwise)
4.trim (where, set)
적 SQL 에서 가장 공통적으로 사용되는 것으로 where의 일부로 포함
//title 값이 비어있다면 해당 조건절은 생략
<select id="findLeHoODU_log"
resultType="String">
SELECT * FROM VELOG
WHERE state = ‘ACTIVE’
<if test="title != null and title != ''">
AND title like #{title}
</if>
</select>
collection 에 대해 반복처리를 하는 것이다. 종종 IN 조건을 사용
//list라는 collection의 item들을 뽑아 (item1,item2,...) IN 조건을 생성
<select id="selectPostIn" resultType="String">
SELECT *
FROM POST P
<where>
<foreach item="item" index="index" collection="list"
open="ID in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</where>
</select>
자바의 switch 구문과 유사
//원하는 조건들을 choose절 안에 생성하여 조건을 설정한다
<select id="findActiveBlogLike"
resultType="String">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null and title != ''">
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>
<select id="findLeHoODU_log"
resultType="String">
SELECT * FROM VELOG
WHERE
<if test="state != null and state != ''">
AND state = #{state}
</if>
<if test="title != null and title != ''">
AND title like #{title}
</if>
</select>
위 쿼리에서 if 조건이 하나도 부합하지 않다면
SELECT * FROM VELOG WHERE
다음과 같은 쿼리가 생성 될 것이다. 이것을 위해 trim을 사용한다
📚
.prefix = 앞에 붙일 조건(where, set)
.prefixOverrides = prefix와 겹칠때 제거 할 것(and, or ..)
.suffix = 뒤에 붙일 문자( ')' ..)
.suffixOverrides = 뒤에 제거할 문자( ',' ..)
<select id="findLeHoODU_log"
resultType="String">
SELECT * FROM VELOG
<trim prefix="WHERE" prefixOverrides="AND |OR">
<if test="state != null and state != ''">
AND state = #{state}
</if>
<if test="title != null and title != ''">
AND title like #{title}
</if>
</trim>
</select>
<select id="findLeHoODU_log"
resultType="String">
SELECT * FROM VELOG
WHERE title like #{title}
</select>