● 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 = ? )

 

+ Recent posts