728x90
반응형
1. #와 $의 차이점
1.1 #의 사용 (PrepareStatement)
#를 사용할 경우 오라클의 PrepareStarement를 사용하게 된다.
예시)
SELECT NAME
FROM TEST
WHERE NAME=#{name}
실제 수행 쿼리)
SELECT NAME
FROM TEST
WHERE NAME='John'
1.2 $의 사용(Statement)
$는 간단히 스트링 자체를 변환 해버린다.
예시)
SELECT NAME
FROM TEST
WHERE SCORE=${score}
실제 수행 쿼리)
SELECT NAME
FROM TEST
WHERE SCORE=99
1.3 차이점
1번은 오라클에서 변수를 바인드 처리하기 때문에
Name값이 달라지는 경우 같은 쿼리로 인식한다.
2번의 경우는 쿼리 자체가 변경되어 들어가기 때문에 Score값에 다른 값이 갈 경우 아예 다른 쿼리로 인식한다.
그럼 어떠한 경우에 사용해야 할까?
SELECT ${column_name}
FROM SCORE
이와 같이 Bind를 할 수 없는 경우 Statement를 사용하게 된다.
1.4 요약
<select id="search" resultMap="searchVo" parameterType="map">
SELECT *
FROM KH.EMPLOYEE
WHERE ${searchType} = #{keyword}
</select>
WHERE절에서 검색타입은 ${}로 전달하며 키워드는 #{}로 전달한다.
달라지는 검색조건에 대응할 수 있다.
2. if문을 이용한 동적쿼리
만약, Mapper에서 다음과 같이 파라미터를 넘겨준다면,
testDate(@Param("dbspaceNum") dbspaceNum: Integer , @Param("dbspaceName") dbspaceName:String )
<if test='dbspaceName != "all"'>
AND a.dbsnum = #{dbspaceNum}
</if>
<select id="search" resultMap="searchVo">
SELECT *
FROM EMPLOYEE
WHERE 1=1
<if test="searchType != null and searchType != ''">
AND NAME LIKE '%' || #{keyword} || '%'
</if>
<if test="gender != null and gender != ''">
AND GENDER = #{gender}
</if>
</select>
3. choose, when, otherwise를 이용한 동적 쿼리
<select id="search" resultMap="searchVo">
SELECT * FROM EMPLOYEE WHERE 1=1
<choose>
<when test="searchType != null and searchType != ''">
AND NAME LIKE '%' || #{keyword} || '%'
</when>
<when test="gender != null and gender != ''">
AND GENDER = #{gender}
</when>
<otherwise>
AND ID = 1
</otherwise>
</choose>
</select>
4. foreach문을 이용한 동적 쿼리
이때, collection 속성에 배열, List 객체가 들어간다.
WHERE ID IN
<foreach collection="job" item='item' index='i' open="(" close=")" separator=",">
#{item}
</foreach>
</select>
728x90
반응형
'👩🏻💻Technical things > SQL' 카테고리의 다른 글
[ 프로그래머스 IS NULL,JOIN,STRING,DATE 문제 풀이 ] (0) | 2020.08.07 |
---|---|
[ 프로그래머스 GROUP BY 문제 풀이 ] (0) | 2020.08.07 |
[ 프로그래머스 SUM,MAX,MIN 문제 풀이 ] (0) | 2020.08.07 |
[ 프로그래머스 SELECT 문 문제 풀이 ] (0) | 2020.08.07 |