프로그래밍

[Mybatis 3] 마이바티스 동적SQL 사용 예제 총정리

마이바티스의 가장 강력한 기능 중 하나는 바로 동적SQL을 처리하는 방법이다.

동적쿼리를 작성하다가 간혹 공백이나 콤마를 붙이는 것을 잊어본적도 있을 것이다.

마이바티스3은 실제 사용해야할 엘리먼트를 줄였으며, OGNL 기반의 표현식이 도입되었다.

if

choose(when, otherwise)

trim(where, set)

foreach

if 엘리먼트 사용법

if 엘리먼트를 사용하여 where절의 일부로 포함되게 할 수 있다. 예를들면:

<select id=”findYourName” resultType=”UserInfoVo”>

SELECT * FROM USER_INFO

WHERE

<if test=”searchParam == null”>

usr_name IS NOT NULL

</if>

<if test=”searchParam != null”>

AND usr_name LIKE #{searchParam}

</if>

</select>

choose, when, otherwise 사용법

자바에서 switch문과 유사한 마이바티스 choose 엘리먼트를 이용할 수 있다. 예를들면:

<select id=”findYourName” resultType=”UserInfoVo”>

SELECT * FROM USER_INFO

WHERE state= ‘1’

<choose>

<when test=”searchParam !=null”>

AND usr_name LIKE #{searchParam}

</when>

<when test=”searchParam2!=null and searchParam.userId!=””>

AND usr_id = #{searchParam2.userId}

</when>

<otherwise>

AND address IS NOT NULL

</otherwise>

</choose>

</select>

where엘리먼트 사용법

if 엘리먼트 사용법에서 본 예제의 경우 if문에 만족하지않아 조건을 타지않는다면 sql 오류가 발생하게된다.

두번째 if문 조건을 만족하더라도 오류가 발생된다.

아래처럼 쿼리가 만들어질것이기 때문이다.

SELECT * FROM USER_INFO

WHERE

AND usr_name LIKE ‘아이유’

이런 오류가 발생하지 않도록 하기위해서는 where 엘리먼트를 사용하여 오류를 해결할 수 있다.

<select id=”findYourName” resultType=”UserInfoVo”>

<where>

<if test=”searchParam == null”>

usr_name IS NOT NULL

</if>

<if test=”searchParam != null”>

AND usr_name LIKE #{searchParam}

</if>

</where>

</select>

where 엘리먼트 태그를 사용함으로써 where 문이 추가되고 그 뒤에 따라오는 쿼리가 AND 또는 OR로 시작된다면 AND 나 OR를 지워버린다.

set 엘리먼트 사용법

동적 업데이트문을 만들때 set엘리먼트를 사용하게되면 update하고자하는 컬럼을 동적으로 포함시키기위해 사용될 수 있다. 예를 들면:

<update id=”updateUserInfo”>

UPDATE TB_USER

<set>

<if test=”userNm !=null”> user_name=#{userNm},

</if>

<if test=”useraddr !=null”> user_address=#{useraddr},

</if>

<if test=”userEmail !=null”> user_mail=#{userEmail},

</if>

<if test=”userPhone !=null”> user_phone=#{userPhone}

</if>

</set>

WHERE user_id=#{userId}

</update>

여기서 set엘리먼트는 동적으로 SET 키워드를 붙이고 불필요한 콤마를 제거한다.

foreach 엘리먼트 사용법

동적SQL에서 공통적으로 필요한 것은 collection에 대한 반복처리이다. 보통 IN 조건절을 처리하기위해 foreach를 사용한다. 예를들면

<select id=”findYourName” resultType=”UserInfoVo”>

SELECT * FROM USER_INFO S

<where>

<foreach item=”item” index=”index” collection=”list” open=”user_id In (” separator=”,” close=”)” nullable=”true”>

#{item}

</foreach>

</where>

</select>

collection 파라미터로는 Map 이나 배열객체와 더불어 List, Set 등과 같은 반복가능한 객체를 전달할 수 있다. Map을 사용할때 index는 key 객체가 되고 항목은 value 객체가 된다.

bind 엘리먼트 사용법

bind엘리먼트는 OGNL표현을 사용해서 변수를 만든 후 컨텍스트에 바인딩한다. 예를들면

<select id=”findYourName” resultType=”UserInfoVo”>

<bind name=”pattern” value=”‘%’ + _parameter.getTitle() +’%'” />

SELECT * FROM USER_INFO

WHERE title LIKE #{pattern}

</select>

Multi-db vendor support

“_databaseId” 변수로 설정된 databaseIdProvider가 동적인 코드에도 사용가능한 경우 데이터베이스 제품별로 서로다른 sql구문을 사용할 수 있다. 다음 예제를 보면

<insert id=”insertTest”>

<selectKey keyProperty=”id” resultType=”int” order=”BEFORE”>

<if test=”_databaseId == ‘oracle'”>

SELECT user_info.nextval FROM DUAL

</if>

<if test=”_databaseId == ‘db2′”>

SELECT nextval for user_info FROM SYSIBM.SYSDUMMY1

</if>

</selectKey>

INSERT INTO user_info VALUES ( #{id}, #{userName})

</insert>

error: Content is protected !!