마이바티스에서 SQL 동적 처리시 주의해야 할 사항이 몇가지 있다.

1. wehre문 진행시 <where>로 감싸줘야 한다.

2. if문 진행시 아래와 같이 <if text = "칼럼명 == '비교값'"을 해야 한다. 여기서 주의할 점은 비교값에 '' 따옴표 처리가 되어 있어야 한다.

3. if문에서 #{ch1} = #{ch2}와 같이 변수로 칼럼명을 넣을 수 없다. 그렇기 때 문에 아래와 같이 직접 칼럼명을 입력해 줘야 한다.

4. <where>처리하면 FROM BOARD 다음에 바로 AND를 사용할 수 있다. SQL 문에서는 불가한 문법이다.

5. LIKE문 진행시 DBMS에 따라 처리 방법이 다르다

    <select id="getListBoard" resultMap="boardResult">
        SELECT SQL_CALC_FOUND_ROWS
        NUM, SUBJECT, WRITER, REG_DATE, READCOUNT
        FROM BOARD
        <where>
            <if test="ch1 != null and ch1 == 'writer'">
                AND writer=#{ch2}
            </if>
            <if test="ch1 != null and ch1 == 'subject'">
                AND subject LIKE CONCAT('%',#{ch2},'%')
            </if>
        </where>
        ORDER BY NUM DESC
        LIMIT #{minLimit}, #{maxLimit}
    </select>

 

우선 1,2,3,4번은 상기 설명한 내용과 같기 때문에 어려운 부분이 없을 것이다.

그럼 5번의 경우를 한번 보도록하자

 

<SQL 문>

SELECT * FROM BOARD WHERE WRITER LIKE '%ch2%'

<MyBatis Using Oracle>

SELECT * FROM BOARD
WHERE WRITER LIKE '%'||#ch2#||'%' 

<MyBatis Using MySql>

SELECT * FROM BOARD
WHERE WRITER LIKE CONCAT(‘%’, #{ch2}, ‘%’)

<전체>

아래와 같이 # 대신 $를 넣을 경우 DBMS 상관없이 정상 검색되는 것으로 확인되었으니 참고하도록하자

subject LIKE '%${ch2}%'

+ Recent posts