개발군싹

3-3) mybatis-#{} 과 ${}의 차이 본문

Mybatis

3-3) mybatis-#{} 과 ${}의 차이

개발자군싹 2023. 12. 4. 20:05

type에 따른 keyword 검색 결과를 가져올 때 -mapper에서 WHERE조건문

<form action="${pageContext.request.contextPath }/emp/searchemp.do" method="get">
				<table>
					<tr>
						<td>
							<select name="type">
								<option value="emp_id">사원번호</option>
								<option value="emp_name">사원이름</option>
								<option value="email">이메일</option>
								<option value="phone">전화번호</option>
							</select>
						</td>
						<td>
							<input type="text" name="keyword" placeholder="검색어입력"/>
							<input type="submit" value="검색"/>
						</td>
					</tr>
				</table>
			</form>

➡️ type과 keyword를 Servlet에서 getParameter()로 데이터를 가져오고 Map으로 -mapper.xml에서 #{}으로 접근 시 데이터 값이 제대로 전달되지 않았다.

 

<select id="searchEmployeeByKeyword" parameterType="map" resultMap="employeeMap">
		SELECT * 
		FROM EMPLOYEE
		WHERE ${type} LIKE '%'||#{keyword}||'%'
		<!-- 
			WEHRE #{type} LIKE '%'||#{keyword}||'%'
			=> WHERE 'emp_id' LIKE '%'||'안녕'||'%'  (X)
		-->
	</select>

위 코드 작성과 같이 출력 시 mybatis는 정상적으로 작동되나 결과값이 출력되지 않음,

why?  #{ } 사용 시 type값에 ‘ ’ 붙어서 출력 되므로 컬럼으로 인식 X

sol)  ${ } 를 이용해서 table name or column name의 값으로 사용한다.

 


why❓ #{}과 ${}의 차이점을 알아봐야한다.

 

파라미터값을 불러올 때 사용하는 표현식

#{ } : 데이터 타입에 맞춰 리터럴로 표시해주는 표현식

  • setString, setInt, setDate …

⇒ 파라미터가 String 형태로 들어와 자동으로 파라미터 형태가 된다.

⇒ ex. #{type}의 type값이 emp_id 이다. ↔ type=’emp_id’가 된다.

 

${ } : 문자로 표현해주는 표현식

  • jsp에서 넘어오는 데이터의 key = value ⇒ type = “emp_id” 일 때,

#{type} : ‘emp_id’

&{type} : emp_id

⇒ 파라미터가 바로 출력된다.

⇒ 컬럼의 자료형에 맞추어 파라미터의 자료형이 변경

⇒ 테이블이나 커럼명을 파라미터로 전달하고 싶을 때 사용 ; #{ }는 자동으로 ‘ ‘ 이 붙어서 출력되므로 이 경우 사용할 수 없다. ${ } 를 사용.