● trim(where, set)
● foreach
<tirm>, <where>, <set>
trim, where, set은 단독으로 사용되지 않고 SQL들을 연결해 주고ㅡ, 앞 뒤에 필요한 구문들(AND, OR, WHERE등)을 추가하거나 생략하는 역활을 함
SQL을 작성하다 보면 상황에 따라서 WHERE나 AND, OR 등이 문제가 되는 상황이 발생할 수도 있음
ex) WHERE ROWNUM <= 20 의 경우 문제가 없지만 검색 조건이 들어가면 문제가 될 수 있음
<where>의 경우 태그 안쪽에서 SQL이 생성될 때는 WHERE 구문이 붙고, 그렇지 않는 경우에는 생성되지 않음
select * from table
<where>
<if test="no != null">
no = #{no}
</if>
</where>
위와 같은 경우 bno 값이 null인 경우에는 WHERE구문이 없어지고, bno 값이 존재하는 경우에만
'WHERE no = xx'와 같이 생성
no가 존재하는 경우 | select * from table WHERE no = 33 |
no가 null인 경우 | select * from table |
<trim>은 태그의 내용을 앞의 내용과 관련되어 원하는 접두/접미를 처리 할 수 있음
select * from table
<where>
<if test="no != null">
no = #{no}
</if>
<trim prefixOverrides = "and">
rownum = 1
</trim>
</where>
trim은 prefix, suffix, prefixOverrides, suffixOverrides 속성을 지정할 수 있음
no가 존재하는 경우 | select * from table WHERE no = 33 and rownum = 1 |
no가 null인 경우 | select * from table WHERE rownum = 1 |
<foreach>
foreach는 List, 배열, 맵 등을 이용해서 루프를 처리
주로 IN 조건에서 많이 사용하지만, 경우에 따라서는 복잡한 WHERE 조건을 만들때에도 사용할 수 있음
ex) 제목('T')은 'TTTT'로 내용('C')은 'CCCC"라는 값을 이용한다면 Map의 형태로 작성이 가능
Map<String, String> map = new HashMap<>();
map.put("T", "TTTT");
map.put("C", "CCCC");
작성된 Map을 파라미터로 전달하고, foreach를 이용하면 다음과 같은 형식이 가능
select * from table
<tirm prefix="where (" suffix=")" prefixOverrides="OR" >
<foreach item="val" index="key" collection="map">
<trim prefix="OR">
<if test="key == 'T'.toString()">
title = #{val}
</if>
<if test="key == 'C'.toString()">
content = #{val}
</if>
<if test="key == 'W'.toString()">
writer = #{val}
</if>
</trim>
</foreach>
</trim>
foreach를 배열이나 List를 이용하는 경우에는 item 속성만을 이용하면 되고, Map의 형태로 key와 value를 이용해야 할 때는 index와 item 속성을 둘 다 이용하고, 전달 된 값에 따라서 처리
select * from table
where ( content = ?
OR title = ? )
'프로그래밍 > Spring' 카테고리의 다른 글
REST 방식으로 전환 및 이유 (0) | 2020.12.24 |
---|---|
[Spring] UriComponentsBuilders 클래스 (0) | 2020.12.24 |
[MyBatis] 동적 태그들(if, choose) (0) | 2020.12.23 |
[Spring] 페이징 처리 (0) | 2020.12.22 |
[JSTL] jsp에서 url의 get parameter 가져오는 방법 (0) | 2020.12.11 |