반응형

* mysql 기준으로 작성하였습니다. 타 DB는 조금씩 사용법이 다를 수 있습니다.

 

 

where절 조건문

<where>
    <if test="param1 != null and param1 !=''">
    	column1 = #{param1}
    </if>
    <if test="param2 != null and param2 !=''">
    	and column2 = #{param2}
    </if>
    <if test="param3 != null and param3 !=''">
    	and column3 = #{param3}
    </if>
</where>

where절에서 if문이 무조건 들어가지 않는 경우 1=1과 같은 편법으로 대처하는 경우가 보이는데

<where></where>을 사용하시면 조건 안에서 조건문이 있는 경우에만 검색해줍니다.

맨 위 param1의 값이 없고 param2의 값이 있는 경우 앞에 있는 and를 자연스럽게 지우고 쿼리를 작성하게되어

쿼리 문법에 문제가 되지 않도록 해줍니다.

 

즉, 아래와 같이 변경해줍니다.

where
    column2 = 'hello'
    and column3 = 100

자연스럽게 column2 앞에 텍스트로 박아놓은 AND문이 사라진걸 볼 수 있습니다.

 

 

 

IN절 검색하기

where column1 IN
  <if test="param1 != null and param1.size > 0">
    <foreach collection="param1" item="item"  open="(" close=")" separator=",">
    	#{item}
    </foreach>
  </if>

IN절의 검색은 해당 컬럼에 포함된 모든 데이터를 검색할때 보통 사용하는데,

(column1='1' or column2='2'...길게 나열하지 않기 위해)

 

$문법의 경우에는 배열을 넘겨주면 아주 쉽게 해결되지만, 취약점에 노출될 수 있으므로 #{}처리하는 방법으로

LIST형태로 param1값을 넘겨주고 해당값의 널체크와 사이즈체크를 한 후 ( ) 구분자, 처리를 통해

자연스럽게 IN (1, 2, 3)의 형태를 만들어 줄 수 있습니다.

 

ex 자바단)

String codeList = request.getParameter("codeList"); //파라미터값을 받고 //codeList = "1,2,3,4"
if(codeList != null && !codeList.equals("")){ //널 체크후
    String[] arr = codeList.split(",");  // ,으로 split처리
    param.put("codeList", Arrays.asList(arr)); //LIST에 파싱하여 파라미터값을 넘긴다.
    int res = service.func(param); //서비스 함수에 사용한다.
}

1,2,3 와 같은 형태로 넘어오는 파라미터 자체를 ,로 스플릿하고 LIST에 파싱하는 예제입니다.

 

 

 

like절 검색하기

$ 표기법

where
	column like '% ${검색값} %'

 

# 표기법 - mysql, maria db

where
	column like concat('%', #{검색값} ,'%')

 

$방식은 sql Injection 취약점에 노출되므로 #방식을 추천합니다.

반응형