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

    分页功能(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方法类:见网盘资料

时间: 2024-10-24 15:31:31

分页的封装——java实现(基于oracle)的相关文章

C#工具类OracleHelper,基于Oracle.ManagedDataAccess.Client封装

基于Oracle.ManagedDataAccess.Client封装的Oracle工具类OracleHelper,代码如下: using System; using System.Data; using System.Collections.Generic; using System.Configuration; using System.Text; using System.IO; using Oracle.ManagedDataAccess.Client; //using System.D

JQuery分页插件封装(源码来自百度,自己封装)

最近由于项目的需要,做了一个基于JQuery的表格分页插件封装,部分源码来源百度,经由自己封装完成. 下面是具体代码和说明,仅供参考.第一步可以先将我的HTML,CSS,JS这三部分的代码创建好后先运行看看,下图是文件目录展示. html <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <

Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据. 语法: CURSOR  游标名  [ (参数名  数据类型,参数名 数据类型,...)]  IS  SELECT   语句; 例如:cursor c1 is select ename from emp; 游标

Java之基于Eclipse搭建SSH框架(下)

在上篇博客里,我简介了Tomcat滴配置与Struts2滴搭建,假设对这个还不会滴童鞋去看一下我滴上篇博客<Java之基于Eclipse搭建SSH框架(上)>.今天我们接着上篇博客滴内容.继续搭建我们滴SSH框架. (一)在上篇博客滴基础上整合Spring: 首先我们把Spring所须要的jar(上篇博客有),拷贝到WebContent下的WEB-INF下的lib里面. 其次在src下创建名为:applicationContext.xml文件.(有些人提示在WEB-INF下创建)个人建议:在s

java 实现往oracle存储过程中传递array数组类型的参数

注:本文来源于 <  java 实现往oracle存储过程中传递array数组类型的参数  > 最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码就不写上了,因为项目中存储过程的调用方法全部是封装好的(好像现在都这样,都姓3层,嘿嘿) 原理: 1.一维数组 A.单纯的一维数组的话,直接建立一个table类型就可以 1 TYPE TYPE_VARCHAR AS TABLE OF VARCHAR2(200); 2.多维数组 A.多维数组就要稍加修改了,如

java项目数据库从oracle迁移到mysql 中 java部分的一些修改

java项目数据库从oracle迁移到mysql: mysql 连接url中useUnicode=true&characterEncoding=UTF-8 的作用:http://blog.csdn.net/afgasdg/article/details/6941712. pom.xml文件中dependency修改:http://mvnrepository.com/artifact/mysql/mysql-connector-java/6.0.6. =======================

java socket 基于UDP/IP 协议

Java  socket 基于UDP/IP协议应用 服务器端:  1.创建DatagramSocket,指定端口号 2.创建DatagramPacket 3.接收客户端发送的数据 4.读取数据 客户端: 1.  定义发送信息: 服务器的IP 端口号  发送的内容 2.  创建DatagramPacket,包含将要发送的信息 3.  创建DatagramSocket 4.  发送数据 服务器端 import java.io.IOException; import java.net.Datagram

java socket 基于TCP/IP 协议

Java socket 基于TCP/IP 协议应用 多线程服务器原理: 1.          服务器端创建serversocket并绑定要监听的端口号 ,循环调用serversoket 的accept()方法,等待客户端的连接请求 2.          客户端创建一个socket绑定服务器端的IP地址和服务器监听的端口号并请求和服务器端连接 3.          服务器端接收到客户端的请求后,创建一个socket与客户端建立专线连接 4.          建立连接的两个socket在一个

基于ORACLE建表和循环回路来创建数据库存储过程SQL语句来实现

一个.概要 在实际的软件开发项目.我们经常会遇到需要创造更多的相同类型的数据库表或存储过程时,.例如.假设按照尾号点表的ID号,然后,你需要创建10用户信息表,的用户信息放在同一个表中. 对于类型同样的多个表,我们能够逐个建立,也能够採用循环的方法来建立.与之相相应的,能够用一个存储过程实现对全部表的操作.也能够循环建立存储过程,每一个存储过程实现对某个特定表的操作. 本文中,我们建立10个员工信息表.每一个表中包括员工工号(8位)和年龄字段,以工号的最后一位来分表.同一时候,我们建立存储过程实