where, set
<select id="findActiveBlogLike" parameterType="Blog" 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” 만을 추가한다. 게다가, 컨텐츠가 “AND” 나 “OR” 로 시작한다면, 그 “AND” 나 “OR”를 지워버린다.
다음 예제는 동적인 update 구문의 유사한 경우이다. set 요소는 update 하고자 하는 칼럼을 동적으로 포함시키기 위해 사용될 수 있다. 예를 들어:
<update id="updateAuthorIfNecessary" parameterType="domain.blog.Author"> update Author <set> <if test="username != null">username=#{username},</if> <if test="password != null">password=#{password},</if> <if test="email != null">email=#{email},</if> <if test="bio != null">bio=#{bio}</if> </set> where id=#{id} </update>
여기서 set 요소는 동적으로 SET 키워드를 붙히고, 필요없는 콤마를 제거한다.
foreach
동적 SQL 에서 공통적으로 필요한 것은 collection 에 대해 반복처리를 하는 것이다. 종종 IN 조건을 사용하게 된다. 예를 들면,
<select id="selectPostIn" resultType="domain.blog.Post"> SELECT * FROM POST P WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select>
foreach 요소는 매우 강력하고 collection 을 명시하는 것을 허용한다. 요소 내부에서 사용할 수 있는 item, index 두가지 변수를 선언한다. 이 요소는 또한 열고 닫는 문자열로 명시할 수 있고 반복간에 둘 수 있는 구분자도 추가할 수 있다.
참고 파라미터 객체로 MyBatis 에 List 인스턴스나 배열을 전달 할 수 있다. 그렇게 하면 MyBatis 는 Map 으로 자동으로 감싸고 이름을 키로 사용한다. List 인스턴스는 “list” 를 키로 사용하고, 배열 인스턴스는 “array” 를 키로 사용한다.
게시판 검색용 실사용 예
<sql id="reboard.where">
<!-- 동적쿼리(dynamic Query) 작성 -->
<if test="value != null and value != ''">
<foreach item="item" collection="key"
open="where" separator="or">
${item} like '%'||#{value}||'%'
</foreach>
</if>
</sql>
<select id="getTotSize" resultType="int" parameterType="kr.co.khi.dto.ReboardDto">
select
count(no) from reboard
<include refid="reboard.where"/>
</select>
<select id="getList" resultType="kr.co.khi.dto.ReboardDto"
parameterType="kr.co.khi.dto.ReboardDto">
select *
from (
select
rank() over(order by ref desc, step asc) r,
no, title, writer, depth, wdate, rcount
from reboard
<include refid="reboard.where"/>
)
where r between #{firstRow} and #{lastRow}
</select>
'Dev. 스프링 > 참고소스 및 예제' 카테고리의 다른 글
로그인/로그아웃시 현재 페이지 그대로 있기 (0) | 2012.12.03 |
---|---|
Spring MVC 패턴에서 ajax를 활용한 실시간 댓글달기 소스 (44) | 2012.11.28 |
Spring, Ajax, JQuery UI 를 이용한 자동 완성(Autocomplete) 텍스트 박스 만들기 (2) | 2012.10.17 |
spring AOP 활용한 Logger 이용 로그기록 남기기 (0) | 2012.10.16 |
스프링(Spring) 에서 첨부파일 다운로드 위한 세팅 및 예제 소스코드 (0) | 2012.10.09 |