03. 数据库分页 下载本文

内容发布更新时间 : 2024/5/8 7:46:16星期一 下面是文章的全部内容请认真阅读。

数据库分页(MySQL)

在《MySQL(SQL入门)》一文中介绍过数据库的基本查询语句(单表查询),在《MySQL(JDBC)》一文中介绍过多表查询技术,本文是DQL的补充。当查询的结果集过多时,不应一次请求查询所有结果,而是采用数据库分页技术,每次查询部分结果集并显示。

1、分页查询语句

不同数据库的分页查询语句是不同的,MySQL中的分页查询语句为:

select * from 表名 limit M,N;

M:开始记录的索引(第一条记录的索引为0)N:一次查询几条记录。 所以从Customers表中分页查询的语句为:

第一页:select * from customers limit 0,10; 第二页:select * from customers limit 10,10; ……

第n页:select * from customers limit (n-1)*10,10;

本文以Customers数据库为例,主要实现下图所示的两种分页效果。

Customers.sql

2、第一种分页的实现

1)设计一个Page类(核心),封装所有与分页有关的数据。 分析第一节的分页效果图片,可知展示一页需要的数据有: ? 每页展示记录条数(pageSize):预先设定 ? 一页记录本身(records):从数据库中查找时需要向Dao层提供开始记录的索引

(startIndex)以及查询条数(pageSize) ? 当前页码(currentPageNum)、总页数(totalPageNum)、上页页码(prePageNum)、

下页页码(nextPageNum):总页数要需根据数据库中查询总结果条数(totalRecordsNum)计算。

这些数据的关系如下图所示,箭头表示依赖关系,如查找records时,需要startIndex。(没有列出pageSize,因为pageSize需要自己预先指定)

由上图可以看出,实例化一个Page类时,需要传入currentPageNum和totalRecordsNum,其他数据都可以计算出来。 package org.flyne.common; public class Page { //每页显示条数(预先定义) private int pageSize = 10; //页面上显示的记录 private List records; //与页面有关 private int currentPageNum; private int totalPageNum; private int prePageNum; private int nextPageNum; //与数据库有关 private int totalRecordsNum; private int startIndex; //实例一个页面时,需要拿到当前页码和总记录条数 public Page(int currentPageNum,int totalRecordsNum){ this.currentPageNum = currentPageNum; this.totalRecordsNum = totalRecordsNum; //计算totalPageNum totalPageNum = totalRecordsNum%pageSize==0?totalRecordsNum/pageSize:(totalRecordsNum/pageSize+1); //计算startIndex startIndex = (currentPageNum - 1)*pageSize; } …………………………各种setter、getter方法………………………… ……………getPrePageNum、getNextPageNum返回前需要计算………… public int getPrePageNum() { prePageNum = currentPageNum - 1; if(prePageNum < 1){ prePageNum = 1; } return prePageNum; } public int getNextPageNum() { nextPageNum = currentPageNum + 1; if(nextPageNum > totalPageNum){ nextPageNum = totalPageNum; } return nextPageNum; } } 2)在service层加入findOneCustomerPage方法 public class CustomerServiceImpl implements CustomerService {