https://www.youtube.com/playlist?list=PLq8wAnVUcTFWxwoc41CqmwnO-ZyRDL0og
강의를 듣고 정리한 내용입니다
검색 메뉴 붙이기
NoticeConsole에 추가
System.out.printf("1.상세조회/ 2.이전/ 3.다음/ 4.글쓰기 / 5.검색 / 6.종료>");
NoticeProgram
switch문 수정
case 4 : //글쓰기
break;
case 5 : //검색
console.inputSearchWord();
break;
case 6 : //종료
System.out.println("종료합니다.");
break EXIT;
NoticeConsole
입력을 받을 때 2가지 키워드가 필요하다
- 검색어와 검색을 위한 필드(제목, 작성자 등)
검색을 위한 searchWord, searchField 변수선언
어떤 변수로 선언할 것인가?
> list를 가지고 올 때 검색 키워드로 사용해야 하기 때문에 다른 메서드와 공유해야하는 정보를 가지고 있다
-> 멤버 변수로 선언한다 //지역변수는 메서드 내에서만 사용가능하다
- private String searchWord;
- private String searchField;
NoticeConsole() 메서드 생성
public NoticeConsole() {
service = new NoticeService();
page = 1;
searchWord = "";
searchField = "";
}
검색 범주를 입력받는 inputSearchWord() 메서드 생성
public void inputSearchWord() {
Scanner kb = new Scanner(System.in);
System.out.println("검색 범주(title/content/writerId) 중에 하나를 입력하세요");
System.out.println(" > ");
searchField = kb.nextLine();
System.out.println("검색어 > ");
searchWord = kb.nextLine();
}
검색 서비스 추가하기
NoticeService
목록을 제공해주는 getList(int page) 속 변수를 추가한다
사용자로부터 페이지 정보만 전달 했지만, 검색 기준값인 field와
실질적으로 검색어가 입력되는 query 변수를 추가로 선언한다
public List<Notice> getList(int page, String field, String query)
throws ClassNotFoundException, SQLException {
sql문 수정
field의 값을 넣어야 할 때 위치 홀더인 "?"로 지정하고
pstmt.setString(1, field);로 값을 넘겨주는 방법을 이용하기 위해 sql문을 수정한다
String sql = "SELECT * FROM NOTICE_VIEW WHERE ? LIKE '%A%' AND NUM BETWEEN ? AND ?";
-> 필드의 값을 세팅하는 방식을 사용하면 결과 집합이 'field'식으로 들어가는데,
''(작은따옴표)는 값이 아니기 때문에 쿼리를 실행할 때 문제가 발생한다
"+"를 이용하여 수정
String sql = "SELECT * FROM NOTICE_VIEW WHERE" + field + " LIKE ? AND NUM BETWEEN ? AND ?";
-> LIKE 뒤의 ?는 값으로 채워도 무방하다
-> 원래 넣는 값이 '%A%'의 형태였기 때문이다
query의 값을 넘겨줄 수 있도록 메서드 내용을 수정한다
pstmt.setString(1, "%"+query+"%");
pstmt.setInt(2, start);
pstmt.setInt(3, end);
NoticeConsole에서 값을 넘겨준다
> printNoticeList() 메서드에
List<Notice> list = service.getList(page, searchField, searchWord); 매개변수 추가
public void printNoticeList() throws ClassNotFoundException, IOException, SQLException {
//변경된 부분
List<Notice> list = service.getList(page, searchField, searchWord);
count = service.getCount(); //항상 값을 구해야 한다
int lastPage = count / 10;
lastPage = count % 10 > 0 ? lastPage+1 : lastPage;
System.out.println("─────────────────────────");
System.out.printf("<공지사항> 총%d 게시글", count);
System.out.println("─────────────────────────");
for(Notice n : list) { //forEach문으로 반복
System.out.printf("%d. %s / %s / %s\n",
n.getId(), n.getTitle(), n.getWriterId(), n.getRegDate());
}
System.out.println("─────────────────────────");
System.out.printf(" %d/%d pages\n", page, lastPage);
}
**누락된 표현식이라는 오류가 발생**
NoticeConsole() 검색 필드에 아무것도 넣지 않아서 발생한 오류이다
기본 문자열로 TITLE을 넣어준다
searchField = "TITLE";
public NoticeConsole() {
service = new NoticeService();
page = 1;
searchField = "TITLE";
searchWord = "";
}
'백엔드 > Database' 카테고리의 다른 글
Mybatis - <sql>, <include> | TIL_159 (0) | 2022.11.03 |
---|---|
Jdbc(ojdbc) 게시글 개수, 마지막 페이지 | TIL_139 (2) | 2022.08.31 |
Jdbc(ojdbc) 페이징 쿼리 | TIL_138 (0) | 2022.08.29 |
Jdbc(ojdbc) 사용자 인터페이스 | TIL_137 (0) | 2022.08.24 |
Jdbc(ojdbc) crud 서비스 클래스 | TIL_136 (0) | 2022.08.19 |