날아라쩡글이의 블로그입니다.

다이나믹 쿼리(select문 하나로 여러 쿼리를 조회하다.) 본문

중앙 HTA (2106기) story/spring java framwork story

다이나믹 쿼리(select문 하나로 여러 쿼리를 조회하다.)

날아라쩡글이 2022. 1. 4. 08:25
728x90
반응형

Criteria : 기준, 표준의 복수형 

form 객체로 등록한다. 내용은 opt와 value라는 속성으로 정의하고, 기본생성자와 getter/setter로 정의한다. 
이제 검색을 통해보일 Controllerdp Criteria를 매개변수로 정의하고, Controller에는 
if(StringUtils.hasText(criteria.getOpt()) && StringUtils.hasText(criteria.getValue())) {
// criteria의 opt에 text가 존재하고 또는 criteria의 value에 text가 존재하면
List<Book> books = bookService.searchBook(criteria);
//객체가 출력되고,
model.addAttribute("books",books);
//model 에 값을 담는다. 
} else {
List<Book> books = bookService.getAllBookList();
model.addAttribute("books",books);
//안 적혀 있으면 전체가 출력된다. 
}
return "book/list.jsp";

그리고 다이나믹 쿼리를 작성한다. where태그를 사용하고 내부에는 if -> choose -> when으로 쿼리를 짜준다. 
where태그 : <where>태그안에 sql문이 포함되면 where 키워드로 변경된다. 
where태그안에 sql문이 포함되었으나 따로 객체가 발견되지 않으면 where태그는 없다고 가정한다. 
where태그안에 sql문중에서 첫번째 sql문이 "and 컬럼명 = 값" 의 형태면 and를 제거한다. 
일반 select문은 동일하게, form도 동일하게 작성 후 
<where>
        <if test="opt != null and value != null">
//만약 opt가 null이 아니고, value가 null이 아니라면 !  보이는 것이다. 
         <!-- 다이나믹 쿼리, 반응형 쿼리  -->
          <choose>
//선택하라 
          <when test="opt == '제목'">
//when의 opt의 값이 제목이라면 
          book_title like '%' || #{value} || '%'
//속성의 값이 동일한것을 책이름에서 찾는다. 
         </when>
         <when test="opt == '저자'">
         book_author = #{value}
        </when>
        <when test="opt == '출판사'">
        book_publisher = #{value}
    </when>
    <when test="opt == '최소가격'">
    book_price >= to_number(#{value})
    </when>
    <when test="opt == '최대가격'">
    book_price &lt; = to_number(#{value}) <!-- < -->
    </when>
    </choose>
    </if>
    </where>
&lt;는 <라는 표시이다. 
반응형 쿼리 : where - if- choose - when

해당 jsp에서 javaScript으로 막아주는 것이 좋다.
//검색버튼을 클릭해서 폼이 제출할 때 실행될 이벤트 핸들러 함수를 등록한다.
$('#form-search-book').submit(function(){ //form에서 submit 이벤트가 발생했을 떄, 반환값에 따라서 form의 입력값이 서버로 제출되거나 제출되지 않을 수 있다.
var opt = $("select[name=opt]").val();
var value = $.trim($(":input[name=value]").val());

if(opt && value) { //opt도 값이 있고, value도 값이 있어야 참이다. 
return true; //이벤트 핸들러 함수가 true를 반환하면 form의 입력값이 서버로 제출된다. 
}
alert("검색조건 혹은 검색어를 입력하세요");
return false; //이벤트 핸들러 함수가 false를 반환하면 form의 입력값이 서버로 제출되지 않는다. 
});

반응형
Comments