oracle一个比较完整的分页工具类Page

package com.thams.bianYan;
import java.io.Serializable;
import java.util.ArrayList;

public class Page implements Serializable{

private static final long serialVersionUID = 1L;

private static final int defaultItemCountPerPage = 10;//page默认的记录的个数设置为10

private int totalRecordCount;//符合该条件的总记录数目

private int itemCountPerPage;//每页显示的记录数目

private int pageNumber;//该页的页码

private int beginRowNum;//起始记录的行码

private int endRowNum;//终止记录的行码

private int lastPageNumber;//最后一页的页码

private int itemCountInPage;//在本页中的记录数目

private boolean hasPrevious;//是否有上一页

private boolean hasNext;//是否有上一页

private ArrayList itemsList;//该页中对象内容

public Page(int totalRecordCount, int itemCountPerPage, int pageNumber) {
//处理构造函数的记录总数参数
if(totalRecordCount<0){
totalRecordCount = 0;
}
//处理构造函数的每一页记录个数的参数
if(itemCountPerPage<=0){
itemCountPerPage = defaultItemCountPerPage;
}
//处理构造函数的当前页码参数
if(pageNumber<0){
pageNumber = 0;
}
if(totalRecordCount==0){
pageNumber = 0;
}else{
if(pageNumber==0){
pageNumber = 1;
}else{
int count = totalRecordCount/itemCountPerPage+(totalRecordCount%itemCountPerPage==0?0:1);
pageNumber = pageNumber>count?count:pageNumber;
}
}
//设置Page的各个成员变量
setTotalRecordCount(totalRecordCount);
setItemCountPerPage(itemCountPerPage);
setPageNumber(pageNumber);
if(totalRecordCount==0){
setBeginRowNum(0);
setEndRowNum(0);
setLastPageNumber(0);
setItemCountInPage(0);
setHasPrevious(false);
setHasNext(false);
}else{
setRowNums(totalRecordCount, itemCountPerPage, pageNumber);
setLastPageNumber(totalRecordCount, itemCountPerPage);
setItemCountInPage(totalRecordCount, itemCountPerPage, pageNumber);
setHasNext();
setHasPrevious();
}
}


/**
* 设置和得到总共含有的记录条数
*/
private void setTotalRecordCount(int totalRecordCount) {
this.totalRecordCount = totalRecordCount;
}
public int getTotalRecordCount() {
return this.totalRecordCount;
}

/**
* 设置和得到每一页有多少个元素
*/
public int getItemCountPerPage() {
return itemCountPerPage;
}
private void setItemCountPerPage(int itemCountPerPage) {
this.itemCountPerPage = itemCountPerPage;
}

/**
* 设置和得到当前页码数
*/
public int getPageNumber() {
return this.pageNumber;
}
private void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}

/**
* 设置和得到该页显示的数据的开始元素的rownum
*/
private void setBeginRowNum(int beginRowNum) {
this.beginRowNum = beginRowNum;
}
public int getBeginRowNum() {
return beginRowNum;
}

/**
* 设置和得到该页显示的数据的结束元素的rownum
*/
private void setEndRowNum(int endRowNum) {
this.endRowNum = endRowNum;
}
public int getEndRowNum() {
return endRowNum;
}

/**
* 设置和得到最后一页的页码数
*/
public int getLastPageNumber() {
return lastPageNumber;
}
private void setLastPageNumber(int lastPageNumber) {
this.lastPageNumber = lastPageNumber;
}
private void setLastPageNumber(int totalRecordCount, int itemCountPerPage) {
if (totalRecordCount % itemCountPerPage == 0) {
setLastPageNumber(totalRecordCount / itemCountPerPage);
} else {
setLastPageNumber(totalRecordCount / itemCountPerPage + 1);
}
}

/**
* 设置和得到当前页面中总共有多少个元素
*/
private void setItemCountInPage(int itemCountInPage) {
this.itemCountInPage = itemCountInPage;
}
public int getItemCountInPage() {
return this.itemCountInPage;
}
private void setItemCountInPage(int totalRecordCount,int itemCountPerPage, int pageNumber) {
int temp = pageNumber * itemCountPerPage;
if (temp <= totalRecordCount) {
setItemCountInPage(itemCountPerPage);
} else {
setItemCountInPage(totalRecordCount - ((pageNumber - 1) * itemCountPerPage));
//此处也可以用取模运算得到
//setItemCountInPage(totalRecordCount%itemCountPerPage);
}
}


/**
* 设置和得到本页是否还有上一页
*/
public boolean isHasPrevious() {
return hasPrevious;
}
private void setHasPrevious(boolean hasPrevious) {
this.hasPrevious = hasPrevious;
}
private void setHasPrevious() {
if (pageNumber == 1) {
setHasPrevious(false);
} else {
setHasPrevious(true);
}
}

/**
* 设置和得到本页是否还有下一页
*/
public boolean isHasNext() {
return hasNext;
}
private void setHasNext(boolean hasNext) {
this.hasNext = hasNext;
}
private void setHasNext() {
if (pageNumber < lastPageNumber) {
setHasNext(true);
} else {
setHasNext(false);
}
}

/**
* 设置和得到该页面中所含有的数据列表
*/
public ArrayList getItemsList() {
return itemsList;
}
public void setItemsList(ArrayList itemsList) {
this.itemsList = itemsList;
}

/**
*设置该页面的元素的起始顺序(记录总数不为0是调用该方法)
*/
private void setRowNums(int totalRecordCount,int itemCountPerPage, int pageNumber) {
setBeginRowNum((pageNumber - 1) * itemCountPerPage + 1);
if(pageNumber * itemCountPerPage>totalRecordCount){
setEndRowNum(totalRecordCount);
}else{
setEndRowNum(pageNumber * itemCountPerPage);
}
}

}

注意: 1.该工具类适宜在oracle下使用rownum来进行分页查询
2.该工具类属性的set方法已经被设置为private私有化,这些属性只有在构造函
数中才能够被维护,因在外部应用程序使用时各个属性是作为控制标识的,所以
取消外部程序对属性的维护权利
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle中实现分页查询需要用到ROWNUM,而查询总记录数需要用到COUNT函数。我们可以使用以下工具类来实现Oracle分页查询和总记录数查询: ```java public class OraclePageHelper { /** * 获取分页SQL * * @param sql 原始SQL * @param pageNo 当前页码 * @param pageSize 每页显示数量 * @return 分页SQL */ public static String getPageSql(String sql, int pageNo, int pageSize) { int startRow = (pageNo - 1) * pageSize + 1; int endRow = startRow + pageSize - 1; StringBuilder pageSql = new StringBuilder(); pageSql.append("SELECT * FROM (SELECT A.*, ROWNUM RN FROM ("); pageSql.append(sql); pageSql.append(") A WHERE ROWNUM <= "); pageSql.append(endRow); pageSql.append(") WHERE RN >= "); pageSql.append(startRow); return pageSql.toString(); } /** * 获取总记录数SQL * * @param sql 原始SQL * @return 总记录数SQL */ public static String getCountSql(String sql) { StringBuilder countSql = new StringBuilder(); countSql.append("SELECT COUNT(*) FROM ("); countSql.append(sql); countSql.append(")"); return countSql.toString(); } } ``` 使用该工具类,我们可以很方便地实现Oracle分页查询和总记录数查询。例如: ```java // 原始SQL String sql = "SELECT * FROM user"; // 查询第1页,每页显示10条记录 int pageNo = 1; int pageSize = 10; // 获取分页SQL String pageSql = OraclePageHelper.getPageSql(sql, pageNo, pageSize); // 获取总记录数SQL String countSql = OraclePageHelper.getCountSql(sql); // 查询总记录数 long total = jdbcTemplate.queryForObject(countSql, Long.class); // 查询数据页 List<User> userList = jdbcTemplate.query(pageSql, new BeanPropertyRowMapper<>(User.class)); ``` 其中,jdbcTemplate是Spring框架提供的JDBC操作模板,我们可以使用它来执行SQL语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值