동적 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 |