<if test = '@com.test.Utils@isEmpty(param)'>
   AND searchVal = #{param}
</if>

@classpath@method(param) 과 같이 사용이 가능

 

보안상 쓸일은 없겠지만 아래와 같이 사용도 가능

SELECT '${@com.test.Utils@isEmpty(param)}' FROM DAUL

 

반응형

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

[Mybatis] 동적쿼리 (if test) 문자열처리  (4) 2020.03.27
[Ibatis] dtd 경로 문제  (1) 2019.12.30
[Mybatis] $과 # 차이  (0) 2019.12.05
[Mybatis] like 조건시 문자열 처리  (1) 2019.02.13

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
[Ibatis] dtd 경로 문제  (1) 2019.12.30
[Mybatis] $과 # 차이  (0) 2019.12.05
[Mybatis] like 조건시 문자열 처리  (1) 2019.02.13

www.ibatis.com 폐쇄로 dtd 경로 로 지정 불가. 

www.ibatis.com 을 ibatis.apache.org/dtd 로 수정해줘야함.

 

[잘못된(폐쇄된) dtd 경로]

<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">

[정상 dtd 경로]

<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

 

참고 :

https://storing.tistory.com/105

 

 

반응형

1. #{}

#{}사용시 mybatis 가 preparedStatement 를 생성하고, preparedStatement 매개변수 #{?} 값을 안전하게 셋팅하게 한다.

#{param} 값을 'param' 과 같이 ''로 감싸며 치환한다.

SQL injection 과 같은 공격을 방지할 수 있다. 더 빠르고, 안전하다.

 

1
2
3
4
5
SELECT *
FROM user_info
WHERE 1=1
AND id = #{id}    -- #{id} >> 'developyo@tistory.com'
AND pw = #{pw}    -- #{pw} >> '1234'
cs

 

2. ${}

${} 사용시 ${param} 값을 param 과 같이 '' 로 감싸지 않은채 치환한다.

SQL injection 과 같은 공격을 받을 수 있다.

직접적인 값 셋팅(ORDER BY 절의 기준 칼럼을 동적으로 지정하고 싶은 경우 등)이 필요한 경우 사용할 수 있다.

1
2
3
SELECT *
FROM user_info
ORDER BY ${columnName} -- ${columnName} >> join_date
cs

 

 

[ SQL injection 공격의 예 ]

1. #{} 사용

id 파라미터로 developyo@tistory.com

pw 파라미터로 '1' OR 1=1 

1
2
3
4
5
SELECT *
FROM user_info
WHERE 1=1
AND id = 'developyo@tistory.com'
AND pw = ''1' OR 1=1'
cs

: sql Exception 발생

 

2. ${} 사용

id 파라미터로 'developyo@tistory.com'

pw 파라미터로 '1' OR 1=1 

1
2
3
4
5
SELECT *
FROM user_info
WHERE 1=1
AND id = 'developyo@tistory.com'
AND pw = '1' OR 1=1
cs

: 조회 성공

 

※ 만약 ${}을 사용할 경우 SQL injection 공격을 막기위해 이스케이프 처리가 필요하다.

 

참고 : https://stackoverflow.com/questions/39954300/when-to-use-vs

반응형

Mybatis like 조건시 문자열 처리

 

 

특정 문자열을 포함한 값을 가져오는 쿼리는

select * from where title like '%대상문자열%'

과 같이 쿼리를 작성 및 사용하는데,

이를 mybatis 에서 사용시 like 뒷 부분을 어떻게 처리해야 할지 난해하다.
*
like '%#{key}%' 와 같이 작성시
아래와 같은 에러로그를 볼 수 있다.

19:16:37,814 INFO  [stdout] (default task-3) ### SQL: SELECT COUNT(*)      FROM banword     WHERE ban_word like '%?%'

 

19:16:37,814 INFO  [stdout] (default task-3) ### Cause: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

19:16:37,814 INFO  [stdout] (default task-3) ; SQL []; Parameter index out of range (1 > number of parameters, which is 0).; nested exception is java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0)., result_cd=0} | RESULT = fail | REMOTEADDR = 127.0.0.1 | PORT = 58841 | TIME = 350 ms

 

해결 :

 

[MySQL]
title like CONCAT('%',#{key},'%')

[Oracle]
title like '%' ||  #{key} || '%'

[MSSQL]
title like '%' + #{key} + '%' 


 

반응형

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

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

+ Recent posts