마이바티스 게시글 검색 처리
검색 기능은 2가지 유형이 있습니다.
- 제목/작성자/내용 단일 항목 검색
- 제목 or 내용, 제목 or 작성자, 내용 or 작성자, 제목 or 내용 or 작성자 다중 항목 검색
단일 항목 검색
간단하게 마이바티스로 처리할 수 있습니다. 아래는 TEST가 포함된 2페이지 게시글 단일 검색입니다.
select
*
from
(
select /*+INDEX_DESC(tbl_board pk_board) */
rownum rn, bno, title, content, writer, regdate,updatedate
from
tbl_board
where
title like '%TEST%'
and rownum<=20
)
where rn >10;
다중 항목 검색
AND와 OR이 섞여있으면 연산자 ()을 이용해서 OR을 처리해야합니다.
select
*
from
(
select /*+INDEX_DESC(tbl_board pk_board) */
rownum rn, bno, title, content, writer, regdate,updatedate
from
tbl_board
where
(title like '%TEST%' or content like '%TEST%')
and rownum<=20
)
where rn >10;
위 코드를 마이바티스 동적 SQL로 작성해봅시다.
동적 태그
- if
- choose(when,otherwise)
- trim(where,set)
- foreach
<if>
<if test = "type=='T'.toString()">
(title like '%'||#{keyword}||'%')
</if>
<choose> =if else
<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>
<otherwise>
(title like '%'||#{keyword}||'%' OR content like '%'||#{keyword}||'%')
</otherwise>
</choose>
<trim>
select * from tbl_board
<where>
<if test="bno != null">
bno=#{bno}
</if>
<trim prefixOverrides = "and">
rownum = 1
</trim>
</where>
bno 존재
select * from tbl_board where bno=33 and rownum=1
bno null
select * from tbl_board where rownum = 1
<foreach>
List, 배열 , 맵 등 처리 가능
복잡한 where 조건 처리 가능
Map<String,String> map = new HashMap<>();
map.put("T","TTTT");
map.put("C","CCCC");
이를 파라미터로 전달하고 foreach사용
select * from tbl_board
<trim prefix="where (" suffix=")" prefixOverrides="OR">
<foreach item="val" index="key" collection="map">
<trim prefix="OR">
<if test="key=='C'.toString()">
content = #{val}
</if>
<if test="key=='T'.toString()">
title = #{val}
</if>
<if test="key=='W'.toString()">
writer = #{val}
</if>
</trim>
</foreach>
</trim>
이제 검색처리를 위해 앞서 만든 Criteria클래스를 수정합시다.
package com.jeongchan.domain;
import org.springframework.web.util.UriComponentsBuilder;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class Criteria {
private int pageNum; // 페이지 번호
private int amount; //한 페이지당 데이터 개수
//추가
private String type;
private String keyword;
public Criteria() {
this(1,10); //기본 값을 1페이지 10개로 지정
}
public Criteria(int pageNum,int amount) {
this.pageNum = pageNum;
this.amount = amount;
}
public String[] getTypeArr(){
return type == null ? new String[] {}:type.split("");
}
}
이를 이용해서 마이바티스는 원하는 속성을 찾을 때 메소드 이름을 기반으로 찾기 때문에 getTypeArr을 collection typeArr으로 지정해주어야합니다.
<!-- 페이징 처리 -->
<!-- pageNum*amount는 끝번호 pageNum-1 *amount는 시작번호 -->
<select id="getListWithPaging" resultType="com.jeongchan.domain.BoardVO">
<![CDATA[
select bno,title,content,writer,regdate,updatedate,viewcnt,replycnt,filecnt
from
(
select /*+INDEX_DESC(jeongchan_board pk_jc_board)*/
rownum rn,bno,title,content,writer,regdate,updatedate,viewcnt,replycnt,filecnt
from
jeongchan_board
where
]]>
<!-- prefixOverrides는 OR로 시작 될경우 제거해주고 시작한다. 밑에서 중간에 OR을 넣어주기 위함 -->
<!-- collection이 typeArr인 이유는 마이바티스는 빈이아닌 get/set 메서드 이름을 보고 판단하기 때문에 Criteria에서 getTypeArr를 보고 typeArr로 판단한다. -->
<!-- prefixOverrides는 맨 앞이 OR로 시작 될경우 제거해주고 시작한다. 밑에서 중간에 OR을 넣어주기 위함 즉 OR title like ~~ OR content like 으로 시작됨 -->
<!-- collection이 typeArr인 이유는 마이바티스는 빈이아닌 get/set 메서드 이름을 보고 판단하기 때문에 Criteria에서 getTypeArr를 보고 typeArr로 판단한다. -->
<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>
<![CDATA[
rownum<=#{pageNum} * #{amount}
)
where rn>(#{pageNum}-1)*#{amount}
]]>
</select>
'웹 > Spring' 카테고리의 다른 글
Spring 차트 그리기 (1) | 2020.03.09 |
---|---|
Spring 이론(응용) - ORACLE 페이징처리 (0) | 2019.08.17 |
Spring 이론(응용) - ORACLE 페이징처리 (0) | 2019.08.10 |
Spring 이론(재) - 스프링 기본 구성 (0) | 2019.07.22 |
Spring 이론(재) - AOP (0) | 2019.07.21 |