동적 쿼리를 구현할 때 가장 기본적으로 사용되는 구문이다.
(test 속성으로 작성된) 특정 조건을 만족할 경우 내부의 구문을 쿼리에 포함한다.
사용 예시
<select id="searchBoard" resultType="arraylist">
SELECT * FROM BOARD
WHERE writer = 'admin'
<if test="title != null">
AND title like #{title}
</if>
</select>
<select id="searchBoard" resultType="arraylist">
SELECT * FROM BOARD
WHERE writer = 'admin'
<if test="title != null">
AND title like #{title}
</if>
<if test="location != null">
AND location like #{location}
</if>
</select>Java의 if-else, switch 구문과 JSTL의 choose 구문과 유사하며 주어진 구문 중 한 가지 만 수행할 때 사용한다.
사용법
<choose> 안의 <when>은 if 또는 case의 역할을, <otherwise>는 else / default의 역할을 한다.
<when>태그는 <if>태그와 형식이 흡사하며, 다중 사용할 수 있으나 하나의 조건 만족에 대해서만 구문을 추가한다.
<otherwise>태그는 <when>태그의 조건 중 어떤 것도 만족하지 않는 경우이다.
<choose>
<when test=" *조건식* ">
*쿼리 구문*
</when>
<when test=" *조건식* ">
*쿼리 구문*
</when>
. . .
<otherwise>
*쿼리 구문*
</otherwise>
</choose>
<select id="searchBoard" resultType="arraylist">
SELECT * FROM BOARD
WHERE COMMENT != ''
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="writer != null">
AND writer like #{writer}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select><select id="searchBoard" resultType="arraylist">
SELECT * FROM BOARD
WHERE
<if test="writer != null">
writer = #{writer}
</if>
<if test="title != null">
AND title like #{title}
</if>
</select>
if 조건 중 어느 것도 만족하지 못했을 때 ⇒ 오류
SELECT * FROM BOARD
WHERE
첫 번째 if 조건은 만족하지 못하고 두 번째 if 조건만 만족할 때 ⇒ 오류
SELECT * FROM BOARD
WHERE
AND title LIKE ' OOO '
⇒ trim (where, set) 으로 해결할 수 있다.
<trim>: 쿼리의 구문의 특정 부분을 없앨 때 쓰인다.
<trim>태그의 속성으로 다음 네 가지를 사용할 수 있다.<select id="searchBoard" resultType="arraylist">
SELECT * FROM BOARD
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="writer != null">
writer = #{writer}
</if>
<if test="title != null">
AND title like #{title}
</if>
</trim>
</select><trim>태그 내의 구문을 생성하고, 내용이 하나라도 있으면 구문의 가장 앞에 WHERE를 붙인다. 만약 구문의 시작이 AND 또는 OR이면 해당 문자를 떼고 WHERE를 붙여 쿼리를 완성한다. 엘리먼트 내용이 없는 경우 아무것도 생성되지 않는다.<where> : 기존 쿼리의 WHERE 절을 동적으로 구현할 때 사용한다.
<where> 태그는 단순히 WHERE만을 추가하지만, 만약 태그 안의 내용이 'AND' 나 'OR'로 시작할 경우 'AND'나 'OR'를 제거한다. 단, 엘리먼트 내에 작성하는 구문에 WHERE를 작성하지 않아야 한다. 그렇지 않으면 WHERE이 2개 생성(WHERE WHERE)될 수 있다.<select id="searchBoard" resultType="arraylist">
SELECT * FROM BOARD
<where>
<if test="writer != null">
writer = #{writer}
</if>
<if test="title != null">
AND title like #{title}
</if>
</where>
</select><set> : 기존 쿼리의 UPDATE SET 절을 동적으로 구현할 때 사용한다.<update id="updateUser">
update USER
<set>
<if test="username != null">
username=#{username},
</if>
<if test="password != null">
password=#{password},
</if>
</set>
where id=#{id}
</update>where와 흡사하나 surffixOverrides 속성을 ',' 로 설정하여 구문의 마지막에 제거할 값을 명시한다.
<update id="updateUser">
update USER
<trim prefix="SET" surffixOverrides=",">
<if test="username != null">
username=#{username},
</if>
<if test="password != null">
password=#{password},
</if>
</trim>
where id=#{id}
</update>
Java의 for문과 같은 역할을 하는 것으로, 동적 쿼리를 구현할 때 collection에 대한 반복 처리를 제공한다.
속성

<select id="searchBadwords" resultType="arraylist">
SELECT * FROM BOARD
WHERE TITLE IN
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</select><!-- 결과 SQL 생성 -->
SELECT * FROM BOARD
WHERE TITLE IN ( 'XXX' , '사행성', '욕설', … )<foreach collection="@com.section01.xml.Application@createRandomMenuCodeList()" item="menuCode" open="(" separator=", " close=")">
#{ menuCode }
</foreach>특정 문장을 미리 생성하여 쿼리에 적용해야 할 경우 사용한다.
'_parameter' 를 통해 전달 받은 값에 접근하여 구문을 생성한다.
사용 예시
<select id="searchBoard" resultType="arraylist">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BOARD
WHERE title LIKE #{pattern}
</select>
@ResultMap("menuResultMap")
@SelectProvider(type=SelectBuilderProvider.class, method="searchMenuByCondition")
List<MenuDTO> searchMenuByCondition(SearchCriteria searchCriteria);@DeleteProvider(type=SqlBuilderProvider.class, method="deleteMenu")
int deleteMenu(@Param("code") int code);public String deleteMenu() {
*// 내용*
return sql.toString();
}SELECT Provider
public String searchMenuByCondition(SearchCriteria searchCriteria) {
SQL sql = new SQL();
sql.SELECT("A.MENU_CODE") // select 대상 컬럼
.SELECT("A.MENU_NAME")
.SELECT("A.MENU_PRICE")
.SELECT("A.CATEGORY_CODE")
.SELECT("A.ORDERABLE_STATUS")
.FROM("TBL_MENU A"); // select 대상 테이블
if("category".equals(searchCriteria.getCondition())) {
sql.JOIN("TBL_CATEGORY B ON (A.CATEGORY_CODE = B.CATEGORY_CODE)") // join 구문
.WHERE("A.ORDERABLE_STATUS = 'Y'")
.AND()
.WHERE("B.CATEGORY_NAME = #{ value }");
} else if("name".equals(searchCriteria.getCondition())) {
sql.WHERE("A.ORDERABLE_STATUS = 'Y'"
, "A.MENU_NAME LIKE CONCAT('%', #{ value }, '%')"); // 조건절
}
return sql.toString();
}
INSERT Provider
public String registMenu(MenuDTO menu) {
SQL sql = new SQL();
sql.INSERT_INTO("TBL_MENU") // insert 대상 테이블
.VALUES("MENU_NAME", "#{ name }") // (insert *대상 컬럼*, #{ *필드명* })
.VALUES("MENU_PRICE", "#{ price }")
.VALUES("CATEGORY_CODE", "#{ categoryCode }")
.VALUES("ORDERABLE_STATUS", "#{ orderableStatus }");
return sql.toString();
}
UPDATE Provider
public String modifyMenu(MenuDTO menu) {
SQL sql = new SQL();
sql.UPDATE("TBL_MENU"); // update 대상 테이블
if(menu.getName() != null && !"".equals(menu.getName())) {
sql.SET("MENU_NAME = #{ name }"); // set 구문 작성
}
if(menu.getPrice() > 0) {
sql.SET("MENU_PRICE = #{ price }");
}
if(menu.getCategoryCode() > 0) {
sql.SET("CATEGORY_CODE = #{ categoryCode }");
}
if(menu.getOrderableStatus() != null && !"".equals(menu.getOrderableStatus())) {
sql.SET("ORDERABLE_STATUS = #{ orderableStatus }");
}
sql.WHERE("MENU_CODE = #{ code }"); // 조건절 작성
return sql.toString();
}
DELETE Provider
public String deleteMenu(int code) {
SQL sql = new SQL();
sql.DELETE_FROM("TBL_MENU") // delete 대상 테이블
.WHERE("MENU_CODE = #{ code }"); // 조건절 작성
return sql.toString();
}