SQL
WHERE 절에서 1=1, 1=0 쓰는 이유?
1. 쿼리 디버깅 시, 주석처리가 편하다.
2. 동적쿼리에서 특정상황마다 WHERE절을 다르게 작성해줘야 할때 편리하다.
참고 : [SQL] WHERE절 1=1, 1=0 의미
검색 메뉴 만들기는 W3Schools BS Inputs2 참고
BoardDAOImpl.list()
public List<BoardVO> list(PageObject pageObject) throws Exception {
System.out.println("BoardDAOImpl.list()");
// 결과가 전달되는 변수의 타입은 List 타입
List<BoardVO> list = null; // 나중에 DB에서 꺼내서 채운다.
try {
// 1.확인 2.연결
con = DB.getConnection();
// 3. sql
// 3-1 원본데이터 가져오기
String sql = "SELECT no, title, writer, "
+ " to_char(writeDate, 'yyyy-mm-dd') writeDate, hit "
+ " FROM board ";
// 검색 조건 처리
String word = pageObject.getWord();
String key = pageObject.getKey();
if(word != null && !word.equals("")) {
// 검색을 안하는 경우도 있기 때문에 WHERE(1=0과 )도 if문 안에 넣어준다.
sql += " WHERE (1=0";
if(key.indexOf("t") >= 0) sql += " OR title LIKE ? ";
if(key.indexOf("c") >= 0) sql += " OR content LIKE ? ";
if(key.indexOf("w") >= 0) sql += " OR writer LIKE ? ";
sql += " ) ";
}
// 기존 sql에 이어붙이기
sql += " ORDER BY no DESC";
// 이중쿼리 처리 - SELECT 안에 SELECT
// 3-2 순서번호 붙이기
sql = " SELECT rownum rnum, no, title, writer, writeDate, hit "
+ " FROM ( " + sql + ")";
// 3-3 페이지 데이터 조건문
sql = " SELECT no, title, writer, writeDate, hit "
+ " FROM ( " + sql + ") "
+ " WHERE rnum BETWEEN ? and ? ";
System.out.println("BoardDAOImpl.list().sql : " + sql);
// 4. 실행객체 & 데이터 세팅
pstmt = con.prepareStatement(sql);
int idx = 0;
// '?'를 세팅
if(word != null && !word.equals("")) {
sql += " WHERE (1=0";
if(key.indexOf("t") >= 0) pstmt.setString(++idx, "%"+word+"%");
if(key.indexOf("c") >= 0) pstmt.setString(++idx, "%"+word+"%");
if(key.indexOf("w") >= 0) pstmt.setString(++idx, "%"+word+"%");
sql += " ) ";
}
pstmt.setLong(++idx, pageObject.getStartRow());
pstmt.setLong(++idx, pageObject.getEndRow());
// 5. 실행 -> rs
rs = pstmt.executeQuery();
// 6. 데이터 저장 - list 변수에 저장
// rs가 null이 아니면 처리한다.
if(rs != null) {
// rs에 다음 데이터가 있으면 처리 한다.
while(rs.next()) {
// list가 null이면 한번만 생성
if(list == null) list = new ArrayList<>();
// 데이터를 담을 vo 객체를 생성
BoardVO vo = new BoardVO();
// rs의 데이터를 꺼내서 vo에 담는다.
vo.setNo(rs.getLong("no"));
vo.setTitle(rs.getString("title"));
vo.setWriter(rs.getString("writer"));
vo.setWriteDate(rs.getString("writeDate"));
vo.setHit(rs.getLong("hit"));
// 데이터가 담긴 vo를 list에 담는다.
list.add(vo);
} // end of while
} // end of if
} catch (Exception e) {
e.printStackTrace(); // 개발자를 위한 오류 메시지
throw new Exception("게시판 리스트 DB처리 중 오류 발생"); // 설정한 오류 메시지 담아서 표시
} finally {
// 7. 닫기
DB.close(con, pstmt, rs);
} // end of try~catch~finally
return list;
} // end of list()
검색 할 때 띄어쓰기만 검색해도 전체 검색결과 나오게 하기
if(word != null && !word.trim().equals(""))
검색 할 때 검색어 앞 뒤에 공백 넣어도 공백 제거하고 검색되게 하기
1. 검색
<!-- 검색 -->
<div> <!-- searchDiv -->
<form class="form-inline" id="searchForm">
<input name="perPageNum" value="${param.perPageNum }" type="hidden">
<div class="form-group">
<select class="form-control" id="key" name="key">
<option selected="selected" value="t">제목</option> <!-- 먼저 선택 되어 있는 것 -->
<option value="c">내용</option>
<option value="w">작성자</option>
<option value="tc">제목+내용</option>
<option value="tw">제목+작성자</option>
<option value="cw">내용+작성자</option>
<option value="tcw">전체</option>
</select>
</div> <!-- end of form-group -->
<div class="form-group">
<input id="search" type="text" class="form-control" placeholder="Search" name="word" value="${param.word }">
</div> <!-- end of form-group -->
<button class="btn btn-default" type="submit">
<i class="glyphicon glyphicon-search"></i>
</button>
</form> <!-- end of form-inline -->
</div> <!-- end of searchDiv -->
// 앞뒤 공백 제거하고 검색
$("#searchForm").submit(function(){
$("#search").val($("#search").val().trim());
});
수료 60%쯤 되니 강사님이 수업이 하기 싫으신지 수업도 대충하고 질문도 안받아준다. 물어봤더니 알아서 하라는식.. 덕분에 응용 실력만 점점 늘고 있는 것 같다. 고맙다고 해야 할 지^^..