数据库分页原理
在Mysql数据库中提供了分页语句:
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1): 为了与 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。
LIMIT子句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定返回的第一行在所有数据中的位置,从0开始(注意不是1),第二个参数指定最多返回行数。例如:
select * from table WHERE … LIMIT 10; #返回前10行
select * from table WHERE … LIMIT 0,10; #返回前10行
select * from table WHERE … LIMIT 10,20; #返回第10-20行数据
在实际设计中,我们会发现分页具有多个属性,分别是页码(pageIndex)、页大小(pageSize)、从数据库中查询的数据总条数(totalSize)、以及用来存放每页查询的数据的集合(list)。(当然也包括页总数(pageCount),不过页总数可以通过(totalSize/pageSize)来获取),所以我们可以设计一个PageBean对象类封装。
具体代码如下:
import java.util.List;
public class PageBean<T>{
/**
* 页码
*/
private int pageNum;
/**
* 页大小
*/
private int pageSize;
/**
* 数据总数
*/
private long totalSize;
/**
* 总页数
*/
private int pageCount;
/**
* 页面数据
*/
private List<T> data;
public PageBean() {
}
public PageBean(int pageNum, int pageSize, long totalSize, List<T> data) {
this.pageNum = pageNum;
this.pageSize = pageSize;
this.totalSize = totalSize;
pageCount= (int) (totalSize%pageSize==0?totalSize/pageSize:totalSize/pageSize+1);
this.data = data;
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public long getTotalSize() {
return totalSize;
}
public void setTotalSize(long totalSize) {
this.totalSize = totalSize;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
@Override
public String toString() {
return "PageBean{" +
"pageNum=" + pageNum +
", pageSize=" + pageSize +
", totalSize=" + totalSize +
", pageCount=" + pageCount +
", data=" + data +
'}';
}
}
现在有一个学生表,需要实现在页面上显示并使用分页。首先创建一个Student类,属性与员工表属性保持一致即可。
tb_emp数据表结构:
- sid:学生学号
- sname:学生姓名
- age:学生年龄
- gender:学生性别
- date:入学日期(由于接收的日期是字符串格式,在存入数据库中会和数据库中的date类型字段不匹配,抛出异常,所以我们可以转换,使用simpledateformate,这里我使用beanutils工具类中提供的转换工具ConverUtils完成转换)