-- id 가 큰 순서대로 번호를 매기고 싶어!
select id, name, addr, 1 from test order by id DESC;
select id, name, addr, rownum from test order by id DESC;
-- 왜인지 나는 이렇게 했는데 id 높은 숫자에 rownum도 높은 숫자가 붙더라..
--쿼리 실행 순서
--from (- where) - select(프로젝션) - order by(정렬)
--무조건 테이블을 먼저 퍼올린다
--정렬이 제일 연산이 많이 든다 (정렬은 비교를 해야하기 때문에)
--정렬 전에 일어나는 건 항상 select
--왜 rownum으로 데이터를 뽑아내지?
--id가 아니고?
--id는 중간중간 빌 수 가 있다 (탈퇴하거나 뭐 그러면 응)
--하지만 rownum은 빌수가 없지
-- 1번부터 3번까지만 뽑고 싶어
-- rownum 은 where 뒤에 일어나는 것이므로 찾을 수 없다 (from해서 퍼올린게 아니라서)
-- rownum 은 하드에서 퍼올릴 때 번호가 촤촤 매겨진다 그러므로 **중간부터 셀수가 없다**
-- 결과 나옴
select id, name, addr, rownum from test where rownum > 0 and rownum < 4 order by id DESC;
-- 결과 안나옴
select id, name, addr, rownum from test where rownum > 3 and rownum < 7 order by id DESC;
-- 인라인 뷰
-- from에 실제 table 이 아니라 연산된 결과가 들어가는 것
select * from
(
select id, name, addr, rownum as num from test order by id DESC
)
where num > 3 and num < 7;
-- 이러면 이제 페이징이 가능해지겠지?
select * from
(
select id, name, addr, rownum as num from test order by id DESC
)
where num >= (page*3) and num <= (page+1)*3;
public class ListAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 세션, 유효성 다 필요없음
// 핵심 로직
**int page = Integer.parseInt(request.getParameter("page"));**
BoardDAO boardDAO = BoardDAO.getInstance(); // 싱글톤패턴
List<Board> boardsEntity = boardDAO.**findAll(page)**;
// System.out.println("======================"); // 오류나서 테스트 해봤음. 습관화해라
// System.out.println(boardsEntity.size());
// 얘는 무조건 가야하니까 이프 필요업
request.setAttribute("boards", boardsEntity);
RequestDispatcher dis = request.getRequestDispatcher("views/board/list.jsp");
dis.forward(request, response);
// 공통로직 끝
}
}
// findAll 오버로딩
public List<Board> findAll(int page) {
List<Board> boards = new ArrayList<>();
// StringBuffer -> 동시접근 불가능
// StringBulider -> 동시접근 가능
StringBuffer sb = new StringBuffer();
**sb.append("select * from");
sb.append("(");
sb.append("select id, title, content, userId, created, rownum as num from boards order by id DESC");
sb.append(")");
sb.append("where num > ? and num <= ?");**
// page 쿼리에 바로 넣는거 아니라고 했지 기억나지
try {
Connection conn = DBConn.디비연결(); // 얘는 무조건 필요!
PreparedStatement pstmt = conn.prepareStatement(sb.toString());
**pstmt.setInt(1, page*3);
pstmt.setInt(2, (page+1)*3);**
ResultSet rs = pstmt.executeQuery(); // 결과(row)를 리턴
while (rs.next()) {
Board board = new Board();
board.setId(rs.getInt("id"));
board.setTitle(rs.getString("title"));
board.setContent(rs.getString("content"));
board.setUserId(rs.getInt("userId"));
board.setCreated(rs.getTimestamp("created"));
boards.add(board);
}
return boards;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
int page = Integer.parseInt(request.getParameter("page"))
이걸 어디서 받아와야할까?
우리 메인으로 갈때 무조건 뭐 타고 가지?
index!