본문 바로가기
back/Mybatis,Ibatis

[Mybatis] 동적쿼리 (if test) 문자열처리

by 사용자 펭귄대장 2020. 3. 27.

Mybatis if test 문자열처리

동적쿼리(dynamic sql)에서 많이 사용되는 Mybatis if test 에서의 문자열 처리.

※ java 문법과 동일하다고 보면 된다.

 

즉 문자열 비교를 위해 연산자 사용을 해선 안되고

equals 함수 사용시 null 값이 파라미터로 들어올 가능성을 대비하여 코딩해야 한다.

 

 

[Mybatis if test 에서의 문자열 처리]

1. null 체크

1
2
3
<if test = 'id neq null and id neq ""'>
<if test = 'id != null and id neq ""'>
<if test = 'id != null and !"".equals(id)'>
cs

 

2. 문자 비교

java단에서 gender를 'M' 으로 저장시(Char)

1
<if test=" 'M'.equals(gender) ">
cs

java단에서 gender를 "F" 으로 저장시(String)

1
<if test=' "F".equals(gender) '>
cs

 

3. 문자열 비교

1) equalsIgnoreCase 사용

1
<if test = '"pyo".equalsIgnoreCase(id)'> 
cs

2) == 연산자 사용

1
<if test = "id == 'pyo'.toString()"> 
cs

3) eq 사용

1
<if test = "id eq 'pyo'.toString()"> 
cs

 

[사용하지 말아야 할 문자열 비교 방법]

1
2
3
4
5
6
<!-- 1 -->
<if test = 'id == "pyo"'>
<!-- 2 -->
<if test = "gender.equals('X')">
<!-- 3 -->
<if test = 'id.equalsIgnoreCase("pyo")'>
cs

순서대로

1) 연산자를 사용한 참조객체의 비교는 에러 유발

2) String.equals(character) 로 취급하여 에러발생

3) java.lang.String 의 .equalsIgnoreCase 와 마찬가지로 위에서 id 가 null 인 경우 exception 발생하므로

<if test = '"pyo".equalsIgnoreCase(id)'> 와 같이 처리해야 한다.

 

 

결론:

character 를 사용하는 특별한 케이스를 제외하고

항상 가장 바깥쪽은 quote( ' ) 로 감싸고 안쪽 문자열은 double quote( " ) 로 감싼다

 

참고:

https://sinpk.tistory.com/entry/Mybatis-if-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%B9%84%EA%B5%90

 

반응형

'back > Mybatis,Ibatis' 카테고리의 다른 글

[mybatis] xml에서 java method 사용  (0) 2020.08.24
[Mybatis] 동적쿼리 (if test) 문자열처리  (4) 2020.03.27
[Ibatis] dtd 경로 문제  (0) 2019.12.30
[Mybatis] $과 # 차이  (0) 2019.12.05
[Mybatis] like 조건시 문자열 처리  (0) 2019.02.13

댓글4

  • 불꽃개발러 2021.03.26 21:10

    마이바티스 비교표현식

    neq 가 아니라 ne 아닙니까?


    답글

  • 최근 소식입니다 2021.08.21 07:33

    '결론' 으로 마지막에 정리하신 말씀이......

    2021년에 한차례 버전업을 하면서 쌍따옴표, 홑따옴표 이슈는 개선된 것 같습니다.(MyBatis Spring Boot Starter 2.2.0 )

    몇 개월 전까지만 해도 MyBatis 사용할 때 결론으로 지으셨던 말씀대로 해야 삽질하다 빡칠 일이 없었는데
    이제는 굳이 '' 를 바깥에 쓸 이유도 "" 를 안쪽에 쓸 이유도 사라진 듯 합니당
    답글