您的位置:首页 > 博客中心 > 数据库 >

分页的封装——java实现(基于oracle)

时间:2022-03-14 05:14

    分页功能(Pagenation类)

 

分页功能的 封装 + 实现:

分页的SQL语句 + 分页工具类Pagenation的细节 + 分页原理

 

一、     分页的SQL语句:

select * from (selectt.*,row_number() over(order by ROWNUM ASC) rn from goods t) where rn>=? andrn<=?

?  goods :为表名,数据从goods中查得

?  第一个? :起始行号

?  第二个? :终点行号

 

二、     分页工具类Pagenation的细节:

Pagenation类:类似JavaBean的工具类,封装了分页后的细节,

主要作用:封装后台分页细节,前台调用分页细节。

简介:实例化时需要传入3个参数,然后类内部计算得到所有分页细节

注意:后期还需要调用setList()方法将分页结果也存入其中。

用法:后台用此类封装分页结果,request给前台,前台展示。

传入参数:当前页数(pageNum)+每页大小(size)+记录总行数(rowCount)

 

三、     分页原理:

1.    后台sevlet根据参数调用分页service()方法,返回值一个Pagenation类的对象,封装了当前要求的分页信息;

2.    service()方法处理过程:根据传入的三个参数,初始化Pagenation类,然后调用dao包下的分页查询类,返回值为一个List,将这个List也存入Pagenation对象中,返回返回该对象;

3.    返回的Pagenation对象包含了有关分页所有内容,将此对象放在request中传到前台,跳转到前台;

4.    在前台中取出Pagenation的相关信息,此时的Pagenation对象中存放着分页信息,用EL和JSTL显示分页信息。

 

四、     代码实现:

1.    分页工具类(核心中的核心类):

 

2.    其他代码:

(1)、前端展示代码:

package com.test.util;

import java.util.List;

/**
 * Pagenation分页工具类:用于数据的分页
 * 根据传入的pageNum参数来确定从哪页开始分页
 * 根据传入的size参数确定每页分多少条记录
 * 根据传入的rowCount参数来确定数据总条数
 * @author Alvin Xing
 */
public class Pagenation {

/* 指定的参数 */
private int pageNum;  //当前页号
private int size;  //页面大小:每页显示多少条数据
/* DB中查找的数据 */
private long rowCount;  //数据总条数:共有多少条数据
private List list;  //数据内容
/* 由以上属性计算得到的属性 */
private int pageCount;  //页面总数
private int startRow;  //当前页面开始行,第一行为第0行
private int first = 1;  //第一页  页号
private int last;  //最后一页  页号
private int prev;  //前一页  页号
private int next;  //后一页  页号
private int startNav;  //导航栏  起始页号
private int endNav;  //导航栏 末尾页号
private int navCount = 10;  //导航栏长度  页号显示数量,最多显示numCount+1条,这里显示11页


/**
* 构造器:初始化基本的三个参数(pageNum, size, rowCount),其他参数由计算得到
*/
public Pagenation(int pageNum, int size, long rowCount) {
//初始化基本参数
this.pageNum = pageNum;
this.size = size;
this.rowCount = rowCount;

//计算得到其他参数
this.pageCount = (int)Math.ceil(this.rowCount/(double)size);
this.last = pageCount;

this.pageNum = Math.min(pageNum, pageCount);  //一般情况下pageNum会等于传入的pageNum,但当传入的pageNum如果大于页面总数,则pageNum就等于最大页面数,即最后一页的页数
this.pageNum = Math.max(1, this.pageNum);  //一般情况下pageNum会等于传入的pageNum,但当传入的pageNum如果小于1,则pageNum就等于1,即第一页的页数

this.startRow = pageNum*size - (size-1);

this.prev = (this.pageNum-1>1)?(this.pageNum-1):1;  //如果<前一页>为第一页,则显示1,否则是{本页页数-1}
this.next = (this.pageNum+1<this.pageCount)?(this.pageNum+1):this.pageCount;  //如果<后一页>为最后一页,则返回{最后一页页数},否则返回{本页数+1}

//导航处理
// this.startNav = (this.pageNum-5>1)?(this.pageNum-5):1;  //导航来开始按钮为{当前页数-5},如果当前页数不足5,则导航栏开始按钮为{第1页}按钮
this.startNav = (this.pageNum-(this.navCount/2)>1)?(this.pageNum-(this.navCount/2)):1;  //优化后的开始按钮,使当前页位于导航栏中间,开始按钮已不是{当前页数-5},而是{当前页数-导航栏总长度的一半}
this.endNav = (this.startNav+navCount<this.last)?(this.startNav+navCount):this.last;  //导航栏结束按钮为{开始页数+导航栏长度},如果{开始页数+导航栏长度}超过页面总数,则结束按钮为{最后一页}
}
public Pagenation(){  //空构造器
}


/**
* Setter() and Getter()
*/
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public long getRowCount() {
return rowCount;
}
public void setRowCount(long rowCount) {
this.rowCount = rowCount;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getStartRow() {
return startRow;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public int getFirst() {
return first;
}
public void setFirst(int first) {
this.first = first;
}
public int getLast() {
return last;
}
public void setLast(int last) {
this.last = last;
}
public int getPrev() {
return prev;
}
public void setPrev(int prev) {
this.prev = prev;
}
public int getNext() {
return next;
}
public void setNext(int next) {
this.next = next;
}
public int getStartNav() {
return startNav;
}
public void setStartNav(int startNav) {
this.startNav = startNav;
}
public int getEndNav() {
return endNav;
}
public void setEndNav(int endNav) {
this.endNav = endNav;
}
public int getNavCount() {
return navCount;
}
public void setNavCount(int navCount) {
this.navCount = navCount;
}

}


(2)、后台处理的servlet代码:见网盘资料

(3)、处理分页的service方法类:见网盘资料

本类排行

今日推荐

热门手游