==========================================
JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle
==========================================
<%@ page contentType="text/html;charset=8859_1" %>
<%
//变量声明
java.sql.Connection sqlCon; //数据库连接对象
java.sql.Statement sqlStmt; //SQL语句对象
java.sql.ResultSet sqlRst; //结果集对象
java.lang.String strCon; //数据库连接字符串
java.lang.String strSQL; //SQL语句
int intPageSize; //一页显示的记录数
int intRowCount; //记录总数
int intPageCount; //总页数
int intPage; //待显示页码
java.lang.String strPage;
int i;
//配置一页显示的记录数
intPageSize = 2;
//取得待显示页码
strPage = request.getParameter("page");
if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一页数据
intPage = 1;
}
else{//将字符串转换成整型
intPage = java.lang.Integer.parseInt(strPage);
if(intPage<1) intPage = 1;
}
//装载JDBC驱动程式
java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//配置数据库连接字符串
strCon = "jdbc:oracle:thin:@linux:1521:ora4cweb";
//连接数据库
sqlCon = java.sql.DriverManager.getConnection(strCon,"hzq","hzq");
//创建一个能够滚动的只读的SQL语句对象
// conn.prepareStatement(sql,游标类型,能否更新记录);
// 游标类型:
// ResultSet.TYPE_FORWORD_ONLY:只进游标
// ResultSet.TYPE_SCROLL_INSENSITIVE:可滚动。但是不受其他用户对数据库更改的影响。
// ResultSet.TYPE_SCROLL_SENSITIVE:可滚动。当其他用户更改数据库时这个记录也会改变。
// 能否更新记录:
// ResultSet.CONCUR_READ_ONLY,只读
// ResultSet.CONCUR_UPDATABLE,可更新
sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
//准备SQL语句
strSQL = "select name,age from test";
//执行SQL语句并获取结果集
sqlRst = sqlStmt.executeQuery(strSQL);
//获取记录总数
sqlRst.last();
intRowCount = sqlRst.getRow();
//记算总页数
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//调整待显示的页码
if(intPage>intPageCount) intPage = intPageCount;
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
<%
if(intPageCount>0){
//将记录指针定位到待显示页的第一条记录上
sqlRst.absolute((intPage-1) * intPageSize + 1);
//显示数据
i = 0;
while(i<intPageSize && !sqlRst.isAfterLast()){
%>
<tr>
<td><%=sqlRst.getString(1)%></td>
<td><%=sqlRst.getString(2)%></td>
</tr>
<%
sqlRst.next();
i++;
}
}
%>
</table>
==============================================================================================
==============================================================================================
oracle中用sql分页的两种方法
--pagezize=5;page=2
select * from
(
select * from
(
select depname from
(
select depname from department order by depname
)
where rownum<5*2
)
order by depname desc
)
where rownum<5
--pagezize=5;page=2
select a.* from (select * from department order by depname) a where rownum<10
minus (select * from (select * from department order by depname) b where rownum<5)
===================================
select * from (select row_.*,rownum rownum_(select * from table)row_ where rownum <=?) where rownum> ?
===================================
package com.kingstargroup.eqa.pageshow.action;
import java.util.List;
import org.apache.struts.action.Action;
import org.springframework.jdbc.core.JdbcTemplate;
import com.kingstargroup.framework.dao.Page;
public abstract class AbstractPageShowAction extends Action {
protected final int defaultPageSize = 50;
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
protected Page queryForPage(String sql, int pageNo, int pageCount, Object[] args) {
String strSql = "";
int startNo = Page.getStartOfPage(pageNo, pageCount);
int endNo = startNo + pageCount;
int argsCount = args.length;
int totleCount = queryForCount(sql, args);
Object[] new_args;
if(startNo==0){
strSql = "select * from (" + sql + ") where rownum <= ?";
new_args = new Object[argsCount+1];
}
else{
strSql = "select * from (select row_.*,rownum rownum_ from (" + sql + ") row_ where rownum <= ?) where rownum_>?";
new_args = new Object[argsCount+2];
new_args[argsCount + 1] = new Integer(startNo);
}
for(int i=0; i<argsCount; i++){
new_args[i] =args[i];
}
new_args[argsCount] = new Integer(endNo);
List list = jdbcTemplate.queryForList(strSql, new_args);
return new Page(startNo, totleCount, pageCount, list);
}
private int queryForCount(String sql, Object[] args){
String strSql = "select count(rowid) from ( " + sql + ")";
return jdbcTemplate.queryForInt(strSql, args);
}
}
package com.kingstargroup.framework.dao;
import java.util.ArrayList;
import java.util.Collection;
import com.kingstargroup.framework.dao.hibernate.BaseHibernateDao;
/**
* 分页对象. 包含数据及分页信息.
*
* @author ajax
*/
public class Page implements java.io.Serializable {
/**
* 当前页第一条数据的位置,从0开始
*/
private int start;
/**
* 每页的记录数
*/
private int pageSize = BaseHibernateDao.DEFAULT_PAGE_SIZE;
/**
* 当前页中存放的记录
*/
private Object data;
/**
* 总记录数
*/
private int totalCount;
private int size;
/**
* 构造方法,只构造空页
*/
public Page() {
this(0, 0, BaseHibernateDao.DEFAULT_PAGE_SIZE, new ArrayList());
}
/**
* 默认构造方法
*
* @param start
* 本页数据在数据库中的起始位置
* @param totalSize
* 数据库中总记录条数
* @param pageSize
* 本页容量
* @param data
* 本页包含的数据
*/
public Page(int start, int totalSize, int pageSize, Object data) {
this.pageSize = pageSize;
this.start = start;
this.totalCount = totalSize;
this.data = data;
if (data instanceof Collection)
this.size = ((Collection) data).size();
else
this.size = ((Object[]) data).length;
}
/**
* 取数据库中包含的总记录数
*/
public int getTotalSize() {
return this.totalCount;
}
/**
* 取总页数
*/
public int getTotalPageCount() {
if (totalCount % pageSize == 0)
return totalCount / pageSize;
else
return totalCount / pageSize + 1;
}
/**
* 取每页数据容量
*/
public int getPageSize() {
return pageSize;
}
/**
* 当前页中的记录
*/
public Object getResult() {
return data;
}
/**
* 取当前页码,页码从1开始
*/
public int getCurrentPageNo() {
return (start / pageSize) + 1;
}
/**
* 是否有下一页
*/
public boolean hasNextPage() {
return (this.getCurrentPageNo() < this.getTotalPageCount() - 1);
}
/**
* 是否有上一页
*/
public boolean hasPreviousPage() {
return (this.getCurrentPageNo() > 1);
}
/**
* 获取任一页第一条数据的位置,每页条数使用默认值
*/
protected static int getStartOfPage(int pageNo) {
return getStartOfPage(pageNo, BaseHibernateDao.DEFAULT_PAGE_SIZE);
}
/**
* 获取任一页第一条数据的位置,startIndex从0开始
*/
public static int getStartOfPage(int pageNo, int pageSize) {
return (pageNo - 1) * pageSize;
}
public int getSize() {
return this.size;
}
}
第<%=intPage%>页 共<%=intPageCount%>页 <%if(intPage<intPageCount){%><a href="jdbc20-oracle.jsp?page=<%=intPage+1%>">下一页</a><%}%> <%if(intPage>1){%><a href="jdbc20-oracle.jsp?page=<%=intPage-1%>">上一页</a><%}%>
</body>
</html>
<%
//关闭结果集
sqlRst.close();
//关闭SQL语句对象
sqlStmt.close();
//关闭数据库
sqlCon.close();
%>