分页封装

本文介绍了一种基于数据库类型的分页查询设计方案,通过抽象基类SplitPageInfo和具体实现类OraclePageInfo实现动态分页功能。该方案可根据不同的数据库类型选择合适的分页对象,并详细展示了针对Oracle数据库的分页SQL生成逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PagesFactory:

/**
* 分页工厂
* 根据数据库类型选择分页对象
*
* @author hjxia
* @version [版本号, 2010-7-27]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class PagesFactory
{
public static final String DEFAULT_DB_TYPE = "oracle";

/**
* 私有构造器,不允许实例化
*/
private PagesFactory()
{

}

/**
* 获取分页对象
*
* @return SplitPageInfo
* @see [类、类#方法、类#成员]
*/
public static SplitPageInfo getSplitPageInfo()
{
SplitPageInfo page = null;

if ("oracle" == DEFAULT_DB_TYPE)
{
page = new OraclePageInfo();
}

return page;
}
}



SplitPageInfo:

/**
* 分页基本对象
* 如要实现相应数据库分页对象,继承此类
*
* @author hjxia
* @version [版本号, 2010-7-27]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public abstract class SplitPageInfo implements Serializable
{
/**
* 序列号
*/
private static final long serialVersionUID = 1L;

/** 开始记录数 */
protected int beginNum = 0;

/** 结束记录数 */
protected int endNum;

/** SQL语句 */
private String strSQL = "";

/** 分页查询的URL */
private String queryURL;

/** 排序字段名称 */
private String orderName;

/** 排序字段类型 */
private String orderType;

/** 记录总数 */
private int totals;

/** 每页显示记录数 */
private int perPageNum;

/** 总页数 */
private int allPage;

/** 当前页 */
private int currPage;

/**
* 构造
*/
public SplitPageInfo()
{
}

/**
* 获取分页SQL
* 抽象方法,子类实现
* @return String sql
* @see [类、类#方法、类#成员]
*/
public abstract String getSplitSql();

/**
* 计算开始和结束记录数
*
* @see [类、类#方法、类#成员]
*/
public void doPage()
{
// 计算总页数
this.setAllPage((this.totals + this.perPageNum - 1) / this.perPageNum);

if (currPage > allPage)
{
currPage = 1;
}
// 计算开始记录数
this.beginNum = (this.getCurrPage() - 1) * this.perPageNum;
// 计算结束记录数
this.endNum = (beginNum + perPageNum) < totals ? beginNum + perPageNum : totals;
}

/**
* 设置排序SQL
*
* @param sql 原始sql
* @see [类、类#方法、类#成员]
*/
public void setOrderSql(String sql)
{
if (null != this.orderName && !"".equals(this.orderName))
{
sql += " order by " + this.orderName;
sql += " " + this.orderType;
}

this.setStrSQL(sql);
}

/**
* 获取查询总记录数的SQL
*
* @return String 查询总记录数的SQL
* @see [类、类#方法、类#成员]
*/
public String getTotalSql()
{
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("select count(*) as recordCount from (");
stringBuffer.append(this.strSQL);
stringBuffer.append(") tableName");

return stringBuffer.toString();
}

public int getBeginNum()
{
return beginNum;
}

public void setBeginNum(int beginNum)
{
this.beginNum = beginNum;
}

public int getEndNum()
{
return endNum;
}

public void setEndNum(int endNum)
{
this.endNum = endNum;
}

public String getStrSQL()
{
return strSQL;
}

public void setStrSQL(String strSQL)
{
this.strSQL = strSQL;
}

public String getQueryURL()
{
return queryURL;
}

public void setQueryURL(String queryURL)
{
this.queryURL = queryURL;
}

public String getOrderName()
{
return orderName;
}

public void setOrderName(String orderName)
{
this.orderName = orderName;
}

public String getOrderType()
{
return orderType;
}

public void setOrderType(String orderType)
{
this.orderType = orderType;
}

public int getTotals()
{
return totals;
}

public void setTotals(int totals)
{
this.totals = totals;
}

public int getPerPageNum()
{
return perPageNum;
}

public void setPerPageNum(int perPageNum)
{
this.perPageNum = perPageNum;
}

public int getAllPage()
{
return allPage;
}

public void setAllPage(int allPage)
{
if (allPage < 1)
{
allPage = 1;
}

this.allPage = allPage;
}

public int getCurrPage()
{
return currPage;
}

public void setCurrPage(int currPage)
{
if (currPage < 1)
{
currPage = 1;
}

this.currPage = currPage;
}
}



OraclePageInfo:

/**
* ORACLE分页对象,继承自SplitPageInfo
*
*
* @author hjxia
* @version [版本号, 2010-7-27]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class OraclePageInfo extends SplitPageInfo
{
/**
* 获取分页SQL
* @return
*/
public String getSplitSql()
{
this.doPage();
StringBuffer sqlBuffer = new StringBuffer();
sqlBuffer.append("select * from (select t.*, rownum r_id from (");
sqlBuffer.append(this.getStrSQL());
sqlBuffer.append(") t where rownum <= ");
sqlBuffer.append(endNum);
sqlBuffer.append(") where r_id > ");
sqlBuffer.append(beginNum);

String str = sqlBuffer.toString();

//记录日志

return str;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值