当前位置:首页 » 操作系统 » 分页算法的实现

分页算法的实现

发布时间: 2022-04-21 04:45:31

Ⅰ 关于java的分页算法,急!

你想效率高 你就直接使用jdbc连接数据库,然后自己封装一个标签,结合servlet做自己的分页标签

Ⅱ 如何使用asp.net分页工具

事件里只要写这两句就OK了
Pager = this.AspNetPager1.CurrentPageIndex;
BindMethod();

//Pager是一个int类型的封装属性 记录当前页
private int Pager
{
set {ViewState["page"] = value; }
get { return (int)ViewState["page"]; }
}
//BindMethod是绑定数据方法 它会根据Pager来查询数据
//sql语句 size是每页显示的个数
select * from (select ROW_NUMBER() as rowNumber from [表名]) where rowNumber begin (Pager * size - size + 1) and (Pager * size)

就这些了 好多查询条件我都省了 你自己加吧

Ⅲ asp.net分页

原理是这样D,首先计算数据总页数,以及当前页,每页的数据数目,这些保存在隐藏域控件或者其他合适的地方
之后,在gridview里,或者下面,输出html
输出的方法大概是这样子
<% for(int i=0;i<count;i++)
{根据需要输出a标签}
%>

Ⅳ 在Java中,用三元运算符实现分页功能

实现原理很简单,就是建立一个Page类,里面放当前访问的页数(这个是从客户浏览器传到后台的数据,所以你的分页需要用它来定位记录的条目)和每一页显示的记录行数。然后通过分页计算就可以得出下列数据。
(假定你的页数从1开始)
1、总页数 = 总记录数/每页大小,如果0!=总记录数%每页大小,那么总页数再+1
2、当前页数(从浏览器传递的参数中获得)
3、表记录的起始位置=(当前页数-1)*每页大小
4、总记录数(select count(*) from [表名] [where [条件]],从数据库中查询得到)
5、每页大小,可以固定,也可以从页面传过来

有了这几个参数之后,就用sql语句查出对应的记录就可以了。
mysql数据库用limit 表记录的起始位置,每页大小 语句添加到你的查询语句最后面
sqlserver数据库用top语句和not in 来做
oracle数据库用rownum来做

再给你一段分页对象代码,你自己先读一下

<pre t="code" l="java">public class Page {

private long totalCount = 0;// 总记录数
private int pageNumber = 1;// 当前页号,默认显示第一页
private int pageSize = 20; // 每页大小,默认每页20条
private int totalPage = 0;// 总页数,默认为0
private int startRow = 0;// 起始记录行号,默认为从表头开始

/**
* 分页计算方法,由setTotalCount调用
*/
public void pagination() {
// 计算总页数
if (this.totalCount % pageSize == 0)
this.totalPage = new Long(this.totalCount / pageSize).intValue();
else
this.totalPage = new Long(this.totalCount / pageSize).intValue() + 1;
// 排除错误页号
if (this.pageNumber < 1)
this.pageNumber = 1;
if (this.pageNumber > this.totalPage)
this.pageNumber = this.totalPage;
// 计算起始行号
this.startRow = (this.pageNumber - 1) * this.pageSize;
}

public long getTotalCount() {
return totalCount;
}

public void setTotalCount(long totalCount) {
this.totalCount = totalCount;
this.pagination();
}

public int getPageNumber() {
return pageNumber;
}

public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}

public int getPageSize() {
return pageSize;
}

public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}

public int getTotalPage() {
return totalPage;
}

public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}

public int getStartRow() {
return startRow;
}

public void setStartRow(int startRow) {
this.startRow = startRow;
}

}

Ⅳ 请问,如果从一个新闻数据库查询的文章内容太长了,想分页该怎么做

分页浏览功能是常见的Web应用功能,对于MySQL数据库来说可以很轻松的使用limit语句实现分页,而对于SQL Server数据库来说,常见的方法是使用数据集本身的游标实现分页,这种方法对于少量数据来说没什么问题,但是对于稍大一点的数据量,例如几十万条数据,则查询速度会降低很多,这里我介绍一种常用的技巧,只要简单的重新构造一下查询SQL语句,就能大幅提高查询性能的方法。 在分页算法中,影响查询速度的关键因素在于返回数据集的大小,我们先在数据表中设置一个名为id的主键,数值为自增量的整数,然后通过重构查询SQL语句,就可以实现SQL查询的优化,重构的SQL如下所示 select top 页大小 * from table1 where id<= (select min (id) from (select top ((页码-1)*页大小) id from table1 order by id desc) as T ) order by id desc 下面的JSP演示代码中,intPageSize为页大小,intPage为页码,id为主键,演示了操作一个t_Proct表,并加入各类查询条件之后的重构SQL的主要语句,经过实际调试,经过这样简单优化后的SQL查询速度远远高于优化前的查询速度。 String sql=" from t_Proct where 1=1 and "; String ProctName = request.getParameter("ProctName"); if (ProctName!=null) sql=sql+"ProctName like '%" + ProctName + "%' and " ; sql=sql.substring(0,sql.length()-4); // 去掉尾部的 and 字符串 sql="select top " + String.valueOf(intPageSize) + " *" +sql+" and id <=(select min(id) from (select top " + String.valueOf(intPage*intPageSize) + " id " + sql + " order by id desc) as T) "; //通过子查询加快速度 sql=sql+" order by id desc "; 转载地址: http://www.williamlong.info/archives/1795.html

Ⅵ 不使用数据库怎么在页面上实现分页显示

一.逻辑分页

1.逻辑分页的第一种方式,利用ResultSet的滚动分页。步骤如下:
a.根据条件sql查询数据库。
b.得到ResultSet的结果集,由于ResultSet带有游标,因此可以使用其next()方法来指向下一条记录。
c.利用next()方法,得到分页所需的结果集。

这种分页方式依靠的是对结果集的算法来分页,因此通常被称为“逻辑分页”。

代码如下:

/**
* TestPageResultSetDAO.java
*
* Copyright 2008. All Rights Reserved.
*/
package com.cosmow.pageresultset.;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.cosmow.pageresultset.entity.Bars;

/**
* TODO class TestPageResultSetDAO
*
* Revision History
*
* 2008-7-7,Cosmo,created it
*/
public class TestPageResultSetDAO {

private final String FIND_BARS_PAGE = "SELECT * FROM YYBARS ORDER BY id";

/**
* 提供JDBC连接方法,返回一个Connection的实例
*
* @return
* @throws SQLException
*/
private Connection getConnection() throws SQLException {
try {
final String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
final String user = "store";
final String password = "store_password";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, user, password);
return con;
} catch (ClassNotFoundException e) {
throw new SQLException(e.getMessage());
}
}

/**
* 逻辑分页方法一,该方法使用移位(rs.next)来进行
*
* @param currentPage
* 当前页
* @param showRows
* 一页显示的数据量
*/
public List<Bars> pageListOne(int currentPage, int showRows) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList<Bars> resultList = new ArrayList<Bars>();
try {
con = getConnection();
ps = con.prepareStatement(FIND_BARS_PAGE);
rs = ps.executeQuery();
// 过滤结果集的变量
int skipBegin = (currentPage - 1) * showRows;
int skipEnd = currentPage * showRows;
// 翻页计数器
int currentNum = 0;
// 当返回结果集中有记录时
while (rs.next()) {
// 以下情况将保证在结果集中有记录时的应用
if (currentNum >= skipBegin && currentNum < skipEnd) {
Bars bar = new Bars();
bar.setId(rs.getLong("id"));
bar.setName(rs.getString("name"));
bar.setType(rs.getInt("type"));
bar.setCreatorId(rs.getLong("creator_id"));
resultList.add(bar);
if (currentNum == skipEnd - 1)
break;
}
currentNum++;
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return resultList;
}
}

2.逻辑分页的第二种方式
利用Scrollable ResultSets(可滚动结果集合)来快速定位到某个游标所指定的记录行,所使用的是ResultSet的absolute()方法。
改进代码如下:
/**
* TestPageResultSetDAO.java
*
* Copyright 2008. All Rights Reserved.
*/
package com.cosmow.pageresultset.;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.cosmow.pageresultset.entity.Bars;

/**
* TODO class TestPageResultSetDAO
*
* Revision History
*
* 2008-7-7,Cosmo,created it
*/
public class TestPageResultSetDAO {

private final String FIND_BARS_PAGE = "SELECT * FROM YYBARS ORDER BY id";

/**
* 提供JDBC连接方法,返回一个Connection的实例
*
* @return
* @throws SQLException
*/
private Connection getConnection() throws SQLException {
try {
final String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
final String user = "store";
final String password = "store_password";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, user, password);
return con;
} catch (ClassNotFoundException e) {
throw new SQLException(e.getMessage());
}
}

/**
* 逻辑分页方法二,使用absolute()方法分页
*
* @param currentPage
* 当前页
* @param showRows
* 一页显示的数据量
*/
public List<Bars> pageListTwo(int currentPage, int showRows) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList<Bars> resultList = new ArrayList<Bars>();
try {
con = getConnection();
ps = con.prepareStatement(FIND_BARS_PAGE);
rs = ps.executeQuery();

// 过滤结果集的变量
int skipBegin = (currentPage - 1) * showRows;
int skipEnd = currentPage * showRows;
// 利用rs.absolute进行定位
if (!rs.absolute(skipBegin))
return resultList;
// 当返回结果集中有记录时
while (rs.next()) {
// 以下情况将保证在结果集中有记录时的应用
if (skipBegin < skipEnd) {
Bars bar = new Bars();
bar.setId(rs.getLong("id"));
bar.setName(rs.getString("name"));
bar.setType(rs.getInt("type"));
bar.setCreatorId(rs.getLong("creator_id"));
resultList.add(bar);
if (skipBegin == skipEnd - 1)
break;
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return resultList;
}
}

虽然和第一种方式区别不大,单效率比ResultSet滚动要好,但是absolute()方法并不是所有jdbc驱动都支持。
可用如下代码测试当前jdbc驱动是否支持可滚动结果集:

int type = rs.getType();
if (type == ResultSet.TYPE_SCROLL_INSENSITIVE || type == ResultSet.TYPE_SCROLL_SENSITIVE)
System.out.println("Result set is scrollable");
else
System.out.println("Result set is not scrollable");

二.物理分页
利用数据库本身的一些特性来分页。即:利用了数据库对sql语法的优化,提高分页性能。
1.针对Oracle数据库
步骤如下:
a.根据所使用的数据库特性来组织sql进行分页。
b.每次跳转页面的sql查询都不相同。
通用的sql分页方式,“限制行数结果集的倒序”分页,步骤如下:
(1).取得符合条件的所有结果集中可以唯一标识的Key值(通常是主键),并正向排序。
(2).利用数据库提供的特殊方法进行“最大结果集”的限制(在Oracle中使用rownum, sql server中使用top, mysql中使用limit...),
该“最大结果集”指包含当前所处页的所有记录数,“最大结果集”应该只包含惟一的Key值。
(3).对步骤(2)中的“最大结果集”进行逆序,并取得“显示当前页显示数量的结果集”,该结果集中只包含惟一的Key值。
(4).通过步骤(3)中所取得的Key值取得显示数据,该显示数据就是当前页应该显示的数据。

2.针对MySQL数据库
在MySQL数据库中offset关键字的意思是"越过",而limit关键字的意思是“限制”,利用这两者结合可轻松分页。
(1)取得符合条件的结果集,包含全字段。
(2)利用offset关键字越过一段结果集(被越过的结果集就是"(当前页 - 1) * 一页显示数")。
(3)利用limit关键字限制取得一段结果集(被限制取得的结果集就是一页显示数)

代码如下:

/**
* TestPageResultSetDAO.java
*
* Copyright 2008. All Rights Reserved.
*/
package com.cosmow.pageresultset.;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.cosmow.pageresultset.entity.Bars;

/**
* TODO class TestPageResultSetDAO
*
* Revision History
*
* 2008-7-7,Cosmo,created it
*/
public class TestPageResultSetDAO {

private final String FIND_BARS_MYSQL = "select * from yybars order by id limit ? offset ?";

/**
* 提供JDBC连接方法,返回一个Connection的实例
*
* @return
* @throws SQLException
*/
private Connection getConnection() throws SQLException {
try {
final String url = "jdbc:oracle:thin:@localhost:1521:ORCL";
final String user = "store";
final String password = "store_password";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection(url, user, password);
return con;
} catch (ClassNotFoundException e) {
throw new SQLException(e.getMessage());
}
}

/**
* 物理分页方法二针对mysql,使用sql语句的limit和offset来进行分页
*
* @param currentPage
* 当前页
* @param showRows
* 一页显示的数据量
*/
public List<Bars> pageListFour(int currentPage, int showRows) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList<Bars> resultList = new ArrayList<Bars>();
try {
con = getConnection();
ps = con.prepareStatement(FIND_BARS_MYSQL);
//传入参数,第一个参数表示显示几条记录(limit关键字的含义)
ps.setInt(1, showRows);
//第二个参数表示丢弃几条记录(offset关键字的含义)
ps.setInt(2, showRows * (currentPage - 1));
rs = ps.executeQuery();
// 当返回结果集中有记录时
while (rs.next()) {
Bars bar = new Bars();
bar.setId(rs.getLong("id"));
bar.setName(rs.getString("name"));
bar.setType(rs.getInt("type"));
bar.setCreatorId(rs.getLong("creator_id"));
resultList.add(bar);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return resultList;
}
}

分页结论:
1.物理分页速度上并不一定快于逻辑分页,逻辑分页速度上也并不一定快于物理分页。
2.物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加诸到应用端来,就算速度上存在优势,
然而其它性能上的优点足以弥补这个缺点。
3.在分页工作前,有必要了解使用数据库本身的一些sql语句特点更好的分页。

分页方法有很多,主要看哪种符合你的要求。

希望我的回答对你有帮助,若帮助到您请及时的采纳
及时不采纳也请赞同下,让咱有继续回答的动力哈

Ⅶ java实现类似分页的算法:一堆机器,每次启动4台,直至全部都启动。获取每次启动的机器集合。

int s=list.size()%4==0?list.size()/4:list.size()/4+1;//获取总页数

for(int x=0;x<=s-1;x++){
if(x<s-1){

System.out.println("第"+x+"批机器开始启动");
for(int y=0;y<4;y++){

list.get(x*4+y).start();
}

}else{
System.out.println("最后一批机器开始启动");
for(int y=0;y<list.size()-(s-1)*4;y++){

list.get(x*4+y).start();
}
}

}

Ⅷ Java Web开发时 如何提高分页效率

建议还是使用带条件查询的sql,这样返回的结果集不会太大。实现分页通常有两种方式,根据具体情况而选择:
1. 把读取的结果集存放在集合中,然后进行分页算法实现分布,这种方式会将内容读取到内存,所以建议带条件查询的结果集使用;
2. 使用数据库的特性,根据传入分页数据(起始位置、读取数目等)来读取数据库。

Ⅸ 求java分页算法(最好有注释)

我以前的jsp页面嵌入的

<%
richen.setpageSize(8); //设置一页显示记录的条数
richen.setuserID(user1.getUerInfo().get("userID").toString());
Vector vect = new Vector();
vect=richen.getData(); //取出所有的记录
String pageNumStr=request.getParameter("pageNum"); //取得当前的页码
if(pageNumStr==""||pageNumStr==null)
pageNumStr="1";
int pageNum=Integer.parseInt(pageNumStr);
richen.setpageNum(pageNum); //设置要显示的那页
richen.page();//分页
int i=0;
int first=(richen.getpageNum()-1)*richen.getpageSize(); //计算从哪条记录开始
int last=richen.getpageNum()*richen.getpageSize();//计算到哪条结束
if(richen.getLastpageNum()!=0&&pageNum==richen.getTotalPage()){ //当最后一页不够时
last=richen.getpageNum()*richen.getpageSize()-(richen.getpageSize()-richen.getLastpageNum());
}
for(i=first;i<last;i++){ //循环显示当页记录
Hashtable hash = new Hashtable();
hash=(Hashtable)vect.get(i);
%>

Ⅹ SQL的几种分页算法

利用SQL语句分页要看你用的什么数据库。
Oracle数据库可以使用ROWNUM或row_number(),例如:Select * from (select ROWNUM rn, t.* from table t) where rn between 11 and 20;
Select * from (select row_number() over (ORDER BY col1) rn, t.* from table t) where rn between 11 and 20;
SQLServer数据库可以用Top或者row_number()函数,道理同上。
利用SQL分页有局限性,就是针对不同的数据库有不同的写法,所以通常会在应用程序里面做分页通用性比较强。但是对于数据量非常庞大的应用来说,还是用SQL分页比较适合。

热点内容
安卓抖音一起看功能在哪里开 发布:2024-10-01 12:10:54 浏览:180
香港云服务器哪里有 发布:2024-10-01 11:57:34 浏览:362
php上传多个文件 发布:2024-10-01 11:49:23 浏览:869
数控980编程 发布:2024-10-01 11:40:48 浏览:891
门镜密码锁多少钱一个 发布:2024-10-01 11:17:35 浏览:367
我的世界网易版服务器可以抄家吗 发布:2024-10-01 10:22:47 浏览:769
手机改微信账号怎么改密码忘了怎么办 发布:2024-10-01 10:22:46 浏览:624
manftp 发布:2024-10-01 10:03:43 浏览:331
存储器mw 发布:2024-10-01 09:55:03 浏览:989
苹果安卓王者如何加好友 发布:2024-10-01 09:54:15 浏览:70