分頁演算法的實現
你想效率高 你就直接使用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分頁比較適合。