본문 바로가기

기타/기타

동적 Dynamic SQL - <trim>,<where>

반응형

동적 Dynamic SQL - <trim>,<where>


1. <where>


 <where> 내부에 컨텐츠가 존재할 때 where 키워드를 포함하고 


 그렇지 않는 경우는 where 키워드를 쓰지 않음


 또한 where 다음 AND 혹은 OR 가 바로 올 경우 AND, OR 키워드를 삭제 시킨다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<select id="testId" resultType="testVo">
 
  SELECT * FROM TEST
 
  <where
 
    <if test="keyword != null">
 
         keyword = #{keyword }
 
    </if
 
    <if test="title != null">
 
        AND title like #{title}
 
    </if>
 
    <if test="author != null">
 
        AND author like #{author}
 
    </if>
 
  </where>
 
</select>

cs



1) 위 형태에서 ketword,title,author 가 모두 null이라면 where 키워드는 쓰지않게된다.


2) 만약 title,author가 null이 아니라면 "AND title like #{title}" 의 AND는 삭제시킨다.



2. <trim>의 속성들


1) prefix : 태그안에 동적SQL생성되면 맨 앞에 붙여준다


2) prefixOverrides : 태그안의 동적SQL이 해당 하는 값으로 시작되면 제거한다. 

단, 같은 trim태그 범위안의 prefix 속성으로 붙여준 값은 영향을 받지않는다.


3) suffix : 태그안에 동적SQL 생성되면 맨 뒤에 붙어준다.


4) suffixOverrides : 태그안의 동적 SQL이 해당 값으로 끝나면 제거한다.

단, 같은 trim태그 범위안의 suffix  속성으로 붙여준 값은 영향을 받지않는다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<trim prefix="(" suffix=") AND " prefixOverrides="OR">
            <foreach item='type' collection="typeArr">
                <trim prefix="OR">
                    <choose>
                        <when test="type == 'T'.toString()">
                            title like '%'||#{keyword}||'%'
                        </when>
                        <when test="type == 'C'.toString()">
                            content like '%'||#{keyword}||'%'
                        </when>
                        <when test="type == 'W'.toString()">
                            writer like '%'||#{keyword}||'%'
                        </when>
                    </choose>
                </trim>
            </foreach>
        </trim>

cs


1행의  prefix 속성에  의해서 "(" 이 생기게 됩니다.


이후에 foreach문이 돌고 , when절에의해 SQL이 형성될때 trim 속성에 의해서 OR 이 추가됩니다.


이런식으로 when절 안의 SQL이 모두 형성된다면


( OR title ... OR content... OR writer ) 이렇게 됩니다. 


근데 1행의 prefixOverrids 속성에 의해 맨 앞의 OR이 삭제되어


( title ... OR content ... OR writer ... ) 이렇게 됩니다.


최종 결과는 아래와 같습니다.

( title like '%'||'keyword'||'%' OR content like '%'||'keyword'||'%' OR writer like '%'||'keyword'||'%' 

) AND



반응형

'기타 > 기타' 카테고리의 다른 글

ci cd 문제해결  (0) 2022.10.03
애자일 vs 폭포수  (0) 2020.05.24
이클립스에서 run history 삭제 방법  (0) 2019.09.30
네이버 스마트 에디터 간단 사용법!  (0) 2019.06.13