Tag Archives: SQL

[iBatis] LIKE 검색 구문 사용하기

iBatis를 사용하다 보니 또하나의 문제에 봉착했다.. LIKE 검색의 %기호를 인식하지 못하는 것이었다.

구글신에게 검색해 보고 다음과 같은 해결책을 얻을 수 있었다.

MySQL :
[code]SELECT * FROM tbl_name WHERE column_name LIKE “%$username$%”[/code]

ORACLE :
[code]SELECT * FROM tbl_name WHERE column_name LIKE  ‘%’ || #username# || ‘%'[/code]

SYBASE/SQL SERVER
[code]SELECT * from tbl_name WHERE column_name LIKE  ‘%’ + #username# + ‘%'[/code]

여기서 변수명을 #로 둘러싸는 것과 $로 둘러싸는것의 차이점을 알 필요가 있다.

#의 경우에는 Prepare Statement로 등록이 된다. 디버그를 찍어봐도 ?로 치환된 이후 값이 대입된다.

하지만 $의 경우 바로 값이 치환된다. 특정 변수가 바로 DB에 입력되므로 보안에 좀더 신경을 써야 할것으로 생각된다.

[iBatis] iBatis 매핑구문에서 비교문(<>) 사용하기

iBatis 매핑 구문을 작성하다 보면 다음과 같은 에러를 만날 수 있다.

사용자 삽입 이미지
WHERE절의 NO값이 10보다 작은것을 가져올려고 했을 뿐인데 문법 오류를 낸다. 이유인 즉슨 <는 태그(Tag)의 시작인데 왜 끝이 없냐고 뭐라 한다-_-; 멍청한 놈아~

하지만 어디까지는 이것은 XML이니 XML규칙을 따르는것이 맞는 것일 것이다. 해결 방법은 두가지가 있다.

1. CDATA로 감싸주는 방법
[code]<sqlMap>
  <select id=”iBatis”>
    <![CDATA[
      SELECT * FROM IBATIS_DATA
      WHERE NO < 10
    ]]>
  </select>
</sqlMap>[/code]

2. <를 &lt;로 치환하는 방법. 마찬가지로 >는 &gt;로 치환하는것을 권장하고 있으나 그냥 >그대로 써도 무관하다.
[code]<sqlMap>
  <select id=”iBatis”>
    SELECT * FROM IBATIS_DATA
    WHERE NO &lt; 10
  </select>
</sqlMap>[/code]