KoreaIt Academy/Spring Boot

[Spring Boot] 단일 검색, 다중 검색 처리, MyBatis의 동적 태그

hongeeii 2021. 10. 13.
728x90
반응형

검색 처리

- 단일 항목 검색
제목/내용/작성자

- 다중 항목 검색
제목 or 내용, 제목 or 작성자, 내용 or 작성자, 제목 or 내용 or 작성자

 


MyBatis의 동적 태그들 

if
choose(when, otherwise)
where
trim
foreach 

 

[if]
- 검색 조건 'T' : 제목이 키워드(사용자가 입력한 값)인 항목을 검색
<if test="type=='T'.toString()">
TITLE LIKE '%'||#{keyword}||'%' 
</if>

- 검색 조건 'C' : 제목이 키워드(사용자가 입력한 값)인 항목을 검색
<if test="type=='C'.toString()">
TITLE LIKE '%'||#{keyword}||'%' 
</if>

- 검색 조건 'W' : 제목이 키워드(사용자가 입력한 값)인 항목을 검색
<if test="type=='W'.toString()">
TITLE LIKE '%'||#{keyword}||'%' 
</if>

[choose]
<choose>
<when test="type=='T'.toString()">
TITLE LIKE '%'||#{keyword}||'%'
<when>
<when test="type=='C'.toString()">
TITLE LIKE '%'||#{keyword}||'%'
<when>
<when test="type=='W'.toString()">
TITLE LIKE '%'||#{keyword}||'%'
<when>
<otherwise>
TITLE LIKE '%'||#{keyword}||'%' OR CONTENT LIKE '%'||#{keyword}||'%' OR WRITER LIKE '%'||#{keyword}||'%'
</otherwise>
</choose>


[where]
SELECT * FROM TBL_BOARD
<where> //안에 아무것도 없을때는 where절이 붙지 않습니다.
<if test="bno !=null">
BNO = #{bno}
</if>
</where>


[trim]
SELECT * FROM TBL_BOARD
<where>
<if test="bno != null>
BNO= #{bno}
</if>
<trim prefixOverrides="AND"> //앞에 and를 붙이고 위에 if문이 false라면 무시하겠다라는 뜻입니다..
ROWNUM = 1
</trim>
</where>


*bno가 null일 때
SELECT * FROM TBL_BOARD WHERE ROWNUM = 1

*bno가 null이 아닐 때
SELECT * FROM TBL_BOARD WHERE BNO=값 AND ROWNUM =1

*prefix만 쓸떄는 무조건 AND가 붙습니다.

*suffix : 마지막에 무조건 붙여줍니다.

<foreach>
List, 배열, Map 등을 이용해서 루프를 처리합니다.

SELECT * FROM TBL_BOARD
<trim prefix="WHERE(" suffix=")" prefixOverrides="OR">
<foreach item="item" index="index" collection = "getter메소드의 원래 이름">
<trim prefix="OR">
<if test="item=='T'.toString()">
TITLE LIKE '%'||#{keyword}||'%' 
</if>
<if test="item=='C'.toString()">
CONTENT LIKE '%'||#{keyword}||'%' 
</if>
<if test="item=='W'.toString()">
WRITER LIKE '%'||#{keyword}||'%' 
</if>
</trim>
</foreach>
</trim>

SELECT * FROM TBL_BOARD WHERE(TITLE LIKE '%검색어'%' 

                                                 OR CONTENT LIKE '%검색어'%'  OR WRITER LIKE '%검색어'%' )

 


 

검색처리

 

Criteria클래스 수정

 

mapper.xml 

//sql id="search" 로 따로 분리 하여

// <include refid="search"></include> 로 분리합니다.

<sql id="search">
        <if test="type != null and keyword != null">
            <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>
        </if>
    </sql>
    
    <select id="getList" resultType="boardVO">
        <![CDATA[
        SELECT BNO, TITLE, CONTENT, WRITER, REGDATE, UPDATEDATE
        FROM
        (
            /*알리아스를 붙인 컬럼에 WHERE절에서 접근할 때에는 FROM절에 작성된 테이블의 컬럼과 동일한 이름으로만 사용이 가능하다.*/
            SELECT /*+ INDEX_DESC(TBL_BOARD PK_BOARD) */
            ROWNUM R, BNO, TITLE, CONTENT, WRITER, REGDATE, UPDATEDATE
            FROM TBL_BOARD
            WHERE
        ]]>
        <include refid="search"></include>
        <![CDATA[
        ROWNUM <= #{pageNum} * #{amount}
        )
        WHERE R > (#{pageNum} - 1) * #{amount}
        ]]>
    </select>
    
    
    <select id="getTotal" resultType="_int">
        SELECT COUNT(BNO) FROM TBL_BOARD
       <where>
         <include refid="search"></include>
       </where>
    </select>

 

 

mapper.java , DAO , SERVICE , CONTROLLER 를 모두 수정합니다.

 

list.html에서 검색 form만들어줍니다.

 

 <form action="/board/list" name="searchForm">
                    <div class="fields">
                        <div class="field">
                            <div id="searchWarp">
                                <select name="type">
                                    <option value="">검색 기준</option>
                                    <option value="T">제목</option>
                                    <option value="C">내용</option>
                                    <option value="W">작성자</option>
                                    <option value="TC">제목 또는 내용</option>
                                    <option value="TW">제목 도는 작성자</option>
                                    <option value="TCW">제목 또는 내용 또는 작성자</option>
                                </select>
                                <input id="keyword" type="text" name="keyword">
                                <a href="javascript:void(0)" class="search button primary icon solid fa-search">검색</a>
                            </div>
                        </div>
                    </div>
                </form>
                
                
 <script th:inline="javascript">
  $("a.search").on("click", function(e){
        e.preventDefault();
        if(!searchForm.find("option:selected").val()){
            alert("검색 종류를 선택하세요");
            return;
        }

        if(!searchForm.find("input#keyword").val()){
            alert("키워드를 입력하세요");
            return;
        }
        searchForm.submit();
    });
 </script>

 

 

잘 나오는것을 확인할 수 있습니다.!!!!!

728x90
반응형

추천 글