[MyBatis] 동적 쿼리 생성시 삽질 주의

 

 

MyBatis로 동적 쿼리 생성시 주의 해야 할 점. 
MyBatis 문법은 RDBMS 별로 쿼리가 조금 씩 달라지며, 
자신이 사용하는 디비에 맞지 않게 사용하면 하루종일 삽질하고 자신의 있는 모습을 볼 수 있을거다. 
 
다 같은 구문을 사용할 줄 알았는데. 이거 때문에 몇시간을 날려 먹었는지.. 
 
 

 

LIKE 문 

 

# SQL 에서 LIKE 문 은 아래와 같이 사용된다.

 

SELECT * FROM TABLE_NAME

WHERE COLUMN_NAME LIKE PATTERN 

 

 

SELECT FROM SAMPLE

 

WHERE TAG LIKE 'Sa%' 

 

OR WHERE TAG LIKE '%am' 

OR WHERE TAG LIKE '%am%'  

 

 

# Mybatis에서는 DBMS 종류 별로 차이가 있다.

 

# MySql

 

SELECT FROM TABLE_NAME

WHERE COLUMN_NAME LIKE CONCAT(‘%’, #{searchKeyword}, ‘%’)

 

# ORACLE

 

SELECT FROM TABLE_NAME

WHERE COLUMN_NAME LIKE '%'||#searchKeyword#||'%' 

 

 

# Ms-Sql

 

SELECT FROM TABLE_NAME

WHERE COLUMN_NAME LIKE '%' + #searchKeyword# + '%'

 

이 처럼 미묘하게 다르니깐, 꼭 확인후 사용 하자.  

 

 

 

 

추가 

 

# # 대신 $ 를 붙여서 SQL 에서 쓰던식으로 써도 된다고는 하는데 해보지는 않았다. 

 

SELECT FROM TABLE_NAME

WHERE COLUMN_NAME LIKE 

'%${

searchKeyword

}%' 

 

반응형

 

[MyBatis] 동적 쿼리  

 

 

쿼리를 짜다보면 동적 쿼리를 만들어야 할 때 가 있다. 싫다 

 

마이바티스에서는 동적 쿼리를 처리하는 방법이 존재한다.

 

 

1. if 문

 

# keyword 가 null 이 아니면  AND KEYWORD LIKE #{keyword} 

 

<select id="dynamicSql" resultType="EgovMap">

    SELECT * FROM MAP

    WHERE POIX = '100'

    <if test="keyword != null">

        AND KEYWORD LIKE #{keyword}

    </if>

</select>

 

# if문 안에서 문자열 비교 

# 파라미터.equals('keyword')# (파라미터 eq 'A'.toString())

 

# 파라미터 == 'A'

 

 <if test="keyword != null and keyword.equals('서울') ">

        AND KEYWORD LIKE #{keyword}

 </if>

 

 

 

2. choose, when, otherwise

 

# if - else 구문 처럼 쓸 수 있다 

 

<select id="dynamicSql" resultType="EgovMap">

  SELECT * FROM MAP

  WHERE POIX = '100'

  <choose>

    <when test="keyword != null and keyword.equals('서울')">

      AND KEYWORD LIKE #{keyword}

    </when>

    <when test="keyword != null and keyword.equals('부산')">

      AND KEYWORD LIKE #{keyword}

    </when>

    <otherwise>

      AND KEYWORD = '경기'

    </otherwise>

  </choose>

</select>

 

 

3. foreach

 

# 마이바티스는 반복문도 가능하다

foreach 를 사용하여 collection 에 대해 반복처리와 IN 조건에 사용한다 

 

<select id="dynamicSql" resultType="EgovMap">

SELECT * FROM MAP

WHERE KEYWORD IN

<foreach item="item" index="index" collection="list" open="(" separator="," close=")">

        #{item}

</foreach>

</select>

 

반응형

+ Recent posts