select * from tbl_todo order by tno desc limit 20, 10;
30 건너뛰는 데이터 수
10 가져오는 데이터 수
-> 뒤에서 30개 스킵해서 10개 가져와라
dto 디렉토리에
PageRequestDTO
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageRequestDTO {
@Builder.Default
@Min(value = 1)
@Positive
private int page = 1;
@Builder.Default
@Min(value = 10)
@Max(value = 100)
@Positive
private int size = 10;
public int getSkip(){
return (page-1)*10; //limit 에서 사용하는 건너뛰기 (skip) 수를 위해
}
}
Todomapper interface
List<TodoVO> selectList(PageRequestDTO pageRequestDTO);
Todomapper.xml
<select id="selectList" resultType="com.ssg.todo.domain.TodoVO">
select * from tbl_todo order by tno desc limit #{skip}, #{size};
</select>
MyBatis는 #{변수명} 형식을 만나면 다음과 같은 과정을 통해 값을 바인딩합니다:
객체의 Getter 메소드 호출: #{변수명}을 통해 참조된 변수에 해당하는 Getter 메소드를 호출합니다. 예를 들어, #{skip}는 getSkip() 메소드의 반환값을 사용합니다. 이는 JavaBean 규칙에 따라 변수명에 해당하는 get변수명() 메소드를 찾아 호출하는 방식입니다.
반환된 값 사용: Getter 메소드에서 반환된 값은 쿼리의 해당 위치에 바인딩되어 SQL 문에 사용됩니다
test
@Test
public void testSelectList(){
PageRequestDTO pageRequestDTO = PageRequestDTO.builder()
.page(1)
.size(10)
.build();
List<TodoVO> voList = todoMapper.selectList(pageRequestDTO);
voList.forEach(vo->log.info(vo));
}
페이지 개수 구하기
Todomapper interface
int getCount(PageRequestDTO pageRequestDTO);
Todomapper.xml
<select id="getCount" resultType="int">
select count(tno) from tbl_todo
</select>
목록 데이터를 위한 DTO/서비스 계층
목록 화면에서 필요한 데이터를 하나의 DTO객체로 만들어서 사용하면 나중에 재사용이 가능
TodoDTO의 목록
전체 데이터의 수
페이지 번호의 처리를 위한 데이터들
(시작 페이지 번호/ 끝 페이지 번호)
현재 페이지 번호(page)를 기준으로
화면에 10개씩 번호 출력
page 1 : start 1 end 10
page 10 : start 1 end 10
page 11 : start 11 end 20
this.end = (Math.ceil(this.page / 10.0))*10
올림
1/10 => 0.1 => 10
11/10 => 1.1 => 2 => 20
10/10 => 1.0 => 1 => 10
this.start = this.end - 9;
total => 75개
페이지수는 8개
int last = (int)(Math.ceil(total/((double)size)));
this.end = end > last? last: end;
PageResponseDTO
@Getter
@ToString
public class PageResponseDTO<E> {
private int page;
private int size;
private int total;
//시작 페이지 번호
private int start;
//끝 페이지 번호
private int end;
//이전 페이지의 존재 여부
private boolean prev;
//다음 페이지의 존재 여부
private boolean next;
private List<E> dtoList;
@Builder(builderMethodName = "All")
public PageResponseDTO(PageRequestDTO pageRequestDTO, List<E> dtoList, int total){
this.page = pageRequestDTO.getPage();
this.size = pageRequestDTO.getSize();
this.total = total;
this.dtoList = dtoList;
this.end =(int) (Math.ceil(this.page/10.0))*10;
this.start = this.end - 9;
int last = (int)(Math.ceil((total/(double)size)));
this.end = end > last ?last :end;
this.prev = this.start>1;
this.next = total > this.end * this.size;
}
}
PageRequestDTO
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageRequestDTO {
@Builder.Default
@Min(value = 1)
@Positive
private int page = 1;
@Builder.Default
@Min(value = 10)
@Max(value = 100)
@Positive
private int size = 10;
public int getSkip(){
return (page-1)*10; //limit 에서 사용하는 건너뛰기 (skip) 수를 위해
}
}
todoService
PageResponseDTO getList(PageRequestDTO pageRequestDTO);
todoServiceimple
@Override
public PageResponseDTO<TodoDTO> getList(PageRequestDTO pageRequestDTO){
List<TodoVO> vos = todoMapper.selectList(pageRequestDTO);
List<TodoDTO> dtos = vos.stream()
.map(vo -> modelMapper.map(vo,TodoDTO.class))
.toList();
int total = todoMapper.getCount(pageRequestDTO);
PageResponseDTO<TodoDTO> pageResponseDTO = PageResponseDTO.<TodoDTO>All()
.dtoList(dtos)
.total(total)
.pageRequestDTO(pageRequestDTO)
.build();
return pageResponseDTO;
}
test
'신세계 - Spring 공부' 카테고리의 다른 글
19주차 배운점 - JPA 설정, CRUD (0) | 2024.09.24 |
---|---|
16주차 배운점 - 스프링 부트, ORM, 하이버네이트 (1) | 2024.09.24 |
15주차 배운점 - Spring mybatis Todo 프로그램 (CRUD) (0) | 2024.09.24 |
15주차 배운점 - 퍼사드 패턴, 컨트롤러, Formatter, 예외처리, Mapper (0) | 2024.09.24 |
15주차 배운점 - 스프링, MyBatis, 스프링 Web MVC (2) | 2024.09.23 |