else {
 showFirstPage = true;
 }
 // 是否展示跳转到最后一页按钮
 if (pageNumbers.contains(totalPage)) {
 // 如果当前页可跳转的页码列表包含最后一页,则不展示跳转到最后一页按钮
 showEndPage = false;
 }
 else {
 showEndPage = true;
 }
 }
 }5. 分页查询请求入口
Controller 层:
@Controller
 public class IndexController {@Autowired
 private QuestionService questionService;/**
• @param request
• @param model
• @param pageNumber 第多少页,默认第 1 页
• @param pageSize 每页显示的问题数量, 默认为 10
• @return
 */
 @GetMapping(“/”)
 public String index(HttpServletRequest request, Model model,
 @RequestParam(name = “pageNumber”, defaultValue = “1”) Integer pageNumber,
 @RequestParam(name = “pageSize”, defaultValue = “10”) Integer pageSize) {
…
// 获取问题列表需要的信息
 PaginationDTO pagination = questionService.list(pageNumber, pageSize);
 model.addAttribute(“pagination”, pagination);…
 }
 }

对应的前端:(Thymeleaf 模板引擎),利用 th:each 标签循环页码列表,然后在 url 后面加上 pageNumber,使得后端能够通过 RequestParam 获取到当前页码


  • 上一页、下一页、第一页和最后一页按钮的前端代码就不贴了,大同小异。
    QuestionService 如下

6. 分页查询

前面说过,页面承载的信息是 Question,我们建立一个 QuestionService.list 方法 用于分页查询,具体包含:

  1. 页码总数 totalPage 的计算
  2. 页码列表的容错处理。比如总页码只有 8 页,但是我们在地址栏手动修改为 12 页,我们需要它在分页栏高亮最后一页并显示最后一页数据,而不是第 12 页,第 12 页是不存在的。

java 根据增量id分页 java分页查询怎么实现_java 根据增量id分页

  1. 分页查询数据。涉及每页起始索引的计算
  • 第 1 页:起始索引 0,limit 0, 10
  • 第 2 页:起始索引 10,limit 10, 20
  • 第 3 页:起始索引 30,limit 20, 30

推出 => 若当前页码为 i,每页显示 10 条数据,则每页的起始索引 offset = 10 * (i - 1)

@Service
 public class QuestionService {@Autowired
 private QuestionMapper questionMapper;/**
• 分页查询
• @param pageNumber 第多少页(当前页码)
• @param pageSize 每页显示的问题数量
• @return
 */
 public PaginationDTO list(Integer pageNumber, Integer pageSize) {
PaginationDTO paginationDTO = new PaginationDTO();
 Integer totalCount = questionMapper.count(); // 问题总数
 Integer totalPage; // 页码总数// 计算页码总数
 if (totalCount % pageSize == 0) {
 totalPage = totalCount / pageSize;
 }
 else {
 totalPage = totalCount / pageSize + 1;
 }// 页码列表的容错处理
 if (pageNumber < 1) {
 pageNumber = 1;
 }
 if(pageNumber > totalPage) {
 pageNumber = totalPage;
 }paginationDTO.setPagination(totalPage, pageNumber);
Integer offset = pageSize * (pageNumber - 1); // 每页的起始索引
 List questions = questionMapper.list(offset, pageSize); // 分页查询当前页的具体数据
 paginationDTO.setQuestionList(questions); // 存储当前页的具体数据
 return paginationDTO;
 }
 }

对应的 MyBatis 的 mapper 文件 QuestionMapper 如下:

@Select(“select * from question limit #{offset}, #{pageSize}”)
 List list(@Param(“offset”) Integer offset, @Param(“pageSize”) Integer pageSize);

MyBatis 约定当我们传入的参数不是实体类对象的时候,需要利用 @Param 自己完成映射

总结

以上。全文应该没啥槽点,分页查询的逻辑并不难,不过自己上手做的话需要兼顾前后端可能还是会出现一些问题,大家最好还是动手做一做。

作者:飞天小牛肉