真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java代碼排序分頁(yè),java中分頁(yè)

JAVA項(xiàng)目中的真分頁(yè)與假分頁(yè)的代碼怎么寫(xiě)~

真分頁(yè):每次從數(shù)據(jù)庫(kù)里按照排序方法,取一段數(shù)據(jù),比如每頁(yè)20條,第一頁(yè)就是1-20 ,第二頁(yè)就是21-40。它是每次都從數(shù)據(jù)庫(kù)里查詢(xún)。都是最新的。假分頁(yè):一次從數(shù)據(jù)庫(kù)里得到很多頁(yè)的數(shù)據(jù),然后緩存起來(lái)。比如每頁(yè)20條,一次取了100條,緩存起來(lái)。第一頁(yè)依然是1-20 ,第二頁(yè)就是21-40。到第6頁(yè)的時(shí)候,再?gòu)臄?shù)據(jù)庫(kù)里取101-200條,在緩存起來(lái)。只不過(guò),取數(shù)據(jù)的時(shí)候不是從數(shù)據(jù)庫(kù)里取了,而是在緩存里取。但是這個(gè)數(shù)據(jù)有可能不是最新的,因?yàn)椴皇侵苯訌臄?shù)據(jù)庫(kù)里查詢(xún)的。這種多用在更新不多的數(shù)據(jù)上。

創(chuàng)新互聯(lián)公司2013年開(kāi)創(chuàng)至今,先為湛江等服務(wù)建站,湛江等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為湛江企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。

java中如何實(shí)現(xiàn)分頁(yè)顯示

一個(gè)簡(jiǎn)單的JAVA分頁(yè)方法

定義兩個(gè)Vector,一個(gè)為儲(chǔ)存查詢(xún)所有記錄的totalV,另一個(gè)儲(chǔ)存當(dāng)前頁(yè)的記錄currentPageV;

總的記錄數(shù):int totalSize = totalV.getSize();

每頁(yè)顯示的記錄數(shù):int countPerPage;

總頁(yè)數(shù):int totalPageNum = totalSize/countPerPage;

//如果總的記錄數(shù)和每頁(yè)記錄數(shù)的余數(shù)大于零,

//那么總的頁(yè)數(shù)為他們的整除結(jié)果加一

if (totalSize%countPerPage 0 ){

totalPageNum = totalSize/countPerPage + 1;

}

當(dāng)前的頁(yè)數(shù):pageNum;

for (int j = 0;jtotalV.size();j++){

//分頁(yè),根據(jù)當(dāng)前的頁(yè)數(shù)和每頁(yè)顯示的記錄數(shù)從totalV中取出記錄

//往currentPageV中添加記錄;

//如果當(dāng)前記錄在(當(dāng)前頁(yè)碼-1)*每頁(yè)顯示記錄數(shù)(包括等于)

//和 當(dāng)前頁(yè)碼*每頁(yè)顯示記錄數(shù)(不包括等于)之間的時(shí)候;

//就屬于該頁(yè)的數(shù)據(jù)

if ( (j = (pageNum - 1) * countPerPage) (j pageNum * countPerPage)) {

currentPageV.addElement(totalV.get(j));

}

//當(dāng)currentPageV記錄數(shù)等于每頁(yè)顯示記錄數(shù),

//停止往currentPageV中添加記錄

if (currentPageV.size() == countPerPage) {

break;

}

}

那么,當(dāng)前頁(yè)中顯示的記錄,就是currentPageV中的記錄。

第二個(gè)分頁(yè)

在使用數(shù)據(jù)庫(kù)的過(guò)程中,不可避免的需要使用到分頁(yè)的功能,可是JDBC的規(guī)范對(duì)此卻沒(méi)有很好的解決。對(duì)于這個(gè)需求很多朋友都有自己的解決方案,比如使用Vector等集合類(lèi)先保存取出的數(shù)據(jù)再分頁(yè)。但這種方法的可用性很差,與JDBC本身的接口完全不同,對(duì)不同類(lèi)型的字段的支持也不好。這里提供了一種與JDBC兼容性非常好的方案。

JDBC和分頁(yè)

Sun的JDBC規(guī)范的制定,有時(shí)很讓人哭笑不得,在JDBC1.0中,對(duì)于一個(gè)結(jié)果集(ResultSet)你甚至只能執(zhí)行next()操作,而無(wú)法讓其向后滾動(dòng),這就直接導(dǎo)致在只執(zhí)行一次SQL查詢(xún)的情況下無(wú)法獲得結(jié)果集的大小。所以,如果你使用的是JDBC1.0的驅(qū)動(dòng),那么是幾乎無(wú)法實(shí)現(xiàn)分頁(yè)的。

好在Sun的JDBC2規(guī)范中很好的彌補(bǔ)了這一個(gè)不足,增加了結(jié)果集的前后滾動(dòng)操作,雖然仍然不能直接支持分頁(yè),但我們已經(jīng)可以在這個(gè)基礎(chǔ)上寫(xiě)出自己的可支持分頁(yè)的ResultSet了。

和具體數(shù)據(jù)庫(kù)相關(guān)的實(shí)現(xiàn)方法

有一些數(shù)據(jù)庫(kù),如Mysql, Oracle等有自己的分頁(yè)方法,比如Mysql可以使用limit子句,Oracle可以使用ROWNUM來(lái)限制結(jié)果集的大小和起始位置。這里以Mysql為例,其典型代碼如下:

// 計(jì)算總的記錄條數(shù)

String SQL = "SELECT Count(*) AS total " + this.QueryPart;

rs = db.executeQuery(SQL);

if (rs.next())

Total = rs.getInt(1);

// 設(shè)置當(dāng)前頁(yè)數(shù)和總頁(yè)數(shù)

TPages = (int)Math.ceil((double)this.Total/this.MaxLine);

CPages = (int)Math.floor((double)Offset/this.MaxLine+1);

// 根據(jù)條件判斷,取出所需記錄

if (Total 0) {

SQL = Query + " LIMIT " + Offset + " , " + MaxLine;

rs = db.executeQuery(SQL);

}

return rs;

}

毫無(wú)疑問(wèn),這段代碼在數(shù)據(jù)庫(kù)是Mysql時(shí)將會(huì)是漂亮的,但是作為一個(gè)通用的類(lèi)(事實(shí)上我后面要提供的就是一個(gè)通用類(lèi)庫(kù)中的一部分),需要適應(yīng)不同的數(shù)據(jù)庫(kù),而基于這個(gè)類(lèi)(庫(kù))的應(yīng)用,也可能使用不同的數(shù)據(jù)庫(kù),所以,我們將不使用這種方法。

另一種繁瑣的實(shí)現(xiàn)方法

我看過(guò)一些人的做法(事實(shí)上包括我在內(nèi),一開(kāi)始也是使用這種方法的),即不使用任何封裝,在需要分頁(yè)的地方,直接操作ResultSet滾到相應(yīng)的位置,再讀取相應(yīng)數(shù)量的記錄。其典型代碼如下:

%

sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,

java.sql.ResultSet.CONCUR_READ_ONLY);

strSQL = "select name,age from test";

//執(zhí)行SQL語(yǔ)句并獲取結(jié)果集

sqlRst = sqlStmt.executeQuery(strSQL);

//獲取記錄總數(shù)

sqlRst.last();

intRowCount = sqlRst.getRow();

//記算總頁(yè)數(shù)

intPageCount = (intRowCount+intPageSize-1) / intPageSize;

//調(diào)整待顯示的頁(yè)碼

if(intPageintPageCount) intPage = intPageCount;

%

table border="1" cellspacing="0" cellpadding="0"

tr

th姓名/th

th年齡/th

/tr

%

if(intPageCount0){

//將記錄指針定位到待顯示頁(yè)的第一條記錄上

sqlRst.absolute((intPage-1) * intPageSize + 1);

//顯示數(shù)據(jù)

i = 0;

while(iintPageSize !sqlRst.isAfterLast()){

%

tr

td%=sqlRst.getString(1)%/td

td%=sqlRst.getString(2)%/td

/tr

%

sqlRst.next();

i++;

}

}

%

/table

很顯然,這種方法沒(méi)有考慮到代碼重用的問(wèn)題,不僅代碼數(shù)量巨大,而且在代碼需要修改的情況下,將會(huì)無(wú)所適從。

使用Vector進(jìn)行分頁(yè)

還見(jiàn)過(guò)另一些實(shí)現(xiàn)分頁(yè)的類(lèi),是先將所有記錄都select出來(lái),然后將ResultSet中的數(shù)據(jù)都get出來(lái),存入Vector等集合類(lèi)中,再根據(jù)所需分頁(yè)的大小,頁(yè)數(shù),定位到相應(yīng)的位置,讀取數(shù)據(jù)?;蛘呦仁褂们懊嫣岬降膬煞N分頁(yè)方法,取得所需的頁(yè)面之后,再存入Vector中。

扔開(kāi)代碼的效率不說(shuō),單是從程序結(jié)構(gòu)和使用的方便性上講,就是很糟糕的。比如,這種做法支持的字段類(lèi)型有限,int, double, String類(lèi)型還比較好處理,如果碰到Blob, Text等類(lèi)型,實(shí)現(xiàn)起來(lái)就很麻煩了。這是一種更不可取的方案。

一個(gè)新的Pageable接口及其實(shí)現(xiàn)

很顯然,看過(guò)上面三種實(shí)現(xiàn)方法后,我們對(duì)新的分頁(yè)機(jī)制有了一個(gè)目標(biāo),即:不與具體數(shù)據(jù)庫(kù)相關(guān);盡可能做到代碼重用;盡可能與原JDBC接口的使用方法保持一致;盡可能高的效率。

首先,我們需要提供一個(gè)與java.sql.ResultSet向下兼容的接口,把它命名為Pageable,接口定義如下:

public interface Pageable extends java.sql.ResultSet{

/**返回總頁(yè)數(shù)

*/

int getPageCount();

/**返回當(dāng)前頁(yè)的記錄條數(shù)

*/

int getPageRowsCount();

/**返回分頁(yè)大小

*/

int getPageSize();

/**轉(zhuǎn)到指定頁(yè)

*/

void gotoPage(int page) ;

/**設(shè)置分頁(yè)大小

*/

void setPageSize(int pageSize);

/**返回總記錄行數(shù)

*/

int getRowsCount();

/**

* 轉(zhuǎn)到當(dāng)前頁(yè)的第一條記錄

* @exception java.sql.SQLException 異常說(shuō)明。

*/

void pageFirst() throws java.sql.SQLException;

/**

* 轉(zhuǎn)到當(dāng)前頁(yè)的最后一條記錄

* @exception java.sql.SQLException 異常說(shuō)明。

*/

void pageLast() throws java.sql.SQLException;

/**返回當(dāng)前頁(yè)號(hào)

*/

int getCurPage();

}

這是一個(gè)對(duì)java.sql.ResultSet進(jìn)行了擴(kuò)展的接口,主要是增加了對(duì)分頁(yè)的支持,如設(shè)置分頁(yè)大小,跳轉(zhuǎn)到某一頁(yè),返回總頁(yè)數(shù)等等。

接著,我們需要實(shí)現(xiàn)這個(gè)接口,由于這個(gè)接口繼承自ResultSet,并且它的大部分功能也都和ResultSet原有功能相同,所以這里使用了一個(gè)簡(jiǎn)單的Decorator模式。

PageableResultSet2的類(lèi)聲明和成員聲明如下:

public class PageableResultSet2 implements Pageable {

protected java.sql.ResultSet rs=null;

protected int rowsCount;

protected int pageSize;

protected int curPage;

protected String command = "";

}

可以看到,在PageableResultSet2中,包含了一個(gè)ResultSet的實(shí)例(這個(gè)實(shí)例只是實(shí)現(xiàn)了ResultSet接口,事實(shí)上它是由各個(gè)數(shù)據(jù)庫(kù)廠(chǎng)商分別實(shí)現(xiàn)的),并且把所有由ResultSet繼承來(lái)的方法都直接轉(zhuǎn)發(fā)給該實(shí)例來(lái)處理。

PageableResultSet2中繼承自ResultSet的主要方法:

//……

public boolean next() throws SQLException {

return rs.next();

}

//……

public String getString(String columnName) throws SQLException {

try {

return rs.getString(columnName);

}

catch (SQLException e) {//這里是為了增加一些出錯(cuò)信息的內(nèi)容便于調(diào)試

throw new SQLException (e.toString()+" columnName="

+columnName+" SQL="+this.getCommand());

}

}

//……

只有在Pageable接口中新增的方法才需要自己的寫(xiě)方法處理。

/**方法注釋可參考Pageable.java

*/

public int getCurPage() {

return curPage;

}

public int getPageCount() {

if(rowsCount==0) return 0;

if(pageSize==0) return 1;

//calculate PageCount

double tmpD=(double)rowsCount/pageSize;

int tmpI=(int)tmpD;

if(tmpDtmpI) tmpI++;

return tmpI;

}

public int getPageRowsCount() {

if(pageSize==0) return rowsCount;

if(getRowsCount()==0) return 0;

if(curPage!=getPageCount()) return pageSize;

return rowsCount-(getPageCount()-1)*pageSize;

}

public int getPageSize() {

return pageSize;

}

public int getRowsCount() {

return rowsCount;

}

public void gotoPage(int page) {

if (rs == null)

return;

if (page 1)

page = 1;

if (page getPageCount())

page = getPageCount();

int row = (page - 1) * pageSize + 1;

try {

rs.absolute(row);

curPage = page;

}

catch (java.sql.SQLException e) {

}

}

public void pageFirst() throws java.sql.SQLException {

int row=(curPage-1)*pageSize+1;

rs.absolute(row);

}

public void pageLast() throws java.sql.SQLException {

int row=(curPage-1)*pageSize+getPageRowsCount();

rs.absolute(row);

}

public void setPageSize(int pageSize) {

if(pageSize=0){

this.pageSize=pageSize;

curPage=1;

}

}

//PageableResultSet2的構(gòu)造方法:

public PageableResultSet2(java.sql.ResultSet rs) throws java.sql.SQLException {

if(rs==null) throw new SQLException("given ResultSet is NULL","user");

rs.last();

rowsCount=rs.getRow();

rs.beforeFirst();

this.rs=rs;

}

/*如果要提高效率,可以利用select count(*) 語(yǔ)句取得所有記錄數(shù),注釋掉

構(gòu)造函數(shù)的rs.last();rowsCount=rs.getRow();rs.beforeFirst();三句。

在調(diào)用構(gòu)造函數(shù)后調(diào)用此方法獲得所有的記錄,參數(shù)是select count(*)后的結(jié)果集

*/

public void setRowsCount(java.sql.ResultSet rs)throws java.sql.SQLException {

if(rs==null) throw new SQLException("given ResultSet is NULL","user");

rowCount=rs.getInt(1);

}

這里只是簡(jiǎn)單的取得一個(gè)總記錄數(shù),并將記錄游標(biāo)移回初始位置(before first),同時(shí)將參數(shù)中的ResultSet賦給成員變量。

Pageable的使用方法

因?yàn)镻ageable接口繼承自ResultSet,所以在使用方法上與ResultSet一致,尤其是在不需要分頁(yè)功能的時(shí)候,可以直接當(dāng)成ResultSet使用。而在需要分頁(yè)時(shí),只需要簡(jiǎn)單的setPageSize, gotoPage,即可。

PreparedStatement pstmt=null;

Pageable rs=null;

……//構(gòu)造SQL,并準(zhǔn)備一個(gè)pstmt.

rs=new PageableResultSet2(pstmt.executeQuery());//構(gòu)造一個(gè)Pageable

rs.setPageSize(20);//每頁(yè)20個(gè)記錄

rs.gotoPage(2);//跳轉(zhuǎn)到第2頁(yè)

for(int i=0; irs.getPageRowsCount(); i++){//循環(huán)處理

int id=rs.getInt(“ID”);

……//繼續(xù)處理

rs.next();

}

總結(jié)

一個(gè)好的基礎(chǔ)類(lèi)應(yīng)該是便于使用,并且具備足夠的可移植性,同時(shí)要保證其功能的完善。在上面的實(shí)現(xiàn)中,我們從java.sql.ResultSet接口繼承出Pageable,并實(shí)現(xiàn)了它。這就保證了在使用中與JDBC原有操作的一致性,同時(shí)對(duì)原有功能沒(méi)有縮減。

同時(shí)它也是易于使用的,因?yàn)榉庋b了一切必要的操作,所以在你的代碼中唯一顯得"難看"和"不舒服"的地方就是需要自己去構(gòu)造一個(gè)PageableResultSet2。不過(guò)只要你愿意,這也是可以解決的。

當(dāng)然它也有具有充分的可移植性,當(dāng)你將數(shù)據(jù)庫(kù)由Oracle變?yōu)镸ysql或者SQLServer的時(shí)候,你仍然可以使用這些分頁(yè)的代碼。它在使用中(或者說(shuō)在移植的過(guò)程中)唯一的限制就是你必須要使用一個(gè)支持JDBC2的驅(qū)動(dòng)(現(xiàn)在明白為什么我把類(lèi)命名為PageableResultSet2了吧。:P),不過(guò),好在JDBC2已經(jīng)成為標(biāo)準(zhǔn)了,絕大多數(shù)的數(shù)據(jù)庫(kù)(如Oracle, Mysql, SQLServer)都有自己的或者第三方提供的JDBC2的驅(qū)動(dòng)。

OK,這個(gè)分頁(yè)的實(shí)現(xiàn)是否對(duì)你的編程有幫助呢?仔細(xì)看看,其實(shí)真正自己寫(xiě)的代碼并不多的,大部分都只是簡(jiǎn)單的轉(zhuǎn)發(fā)操作。一個(gè)合適的模式應(yīng)用可以幫你很大忙。

這里只是簡(jiǎn)單的取得一個(gè)總記錄數(shù),并將記錄游標(biāo)移回初始位置(before first),同時(shí)將參數(shù)中的ResultSet賦給成員變量。

java代碼如何實(shí)現(xiàn)分頁(yè)功能!?。?!請(qǐng)高手幫忙...

//============分頁(yè)功能===============

int pageSize=3; //一頁(yè)顯示幾條記錄

int pageNow=1; //希望顯示第幾條記錄

//動(dòng)態(tài)的接收pageNow

String sPageNow=req.getParameter("pageNowok");

if(sPageNow!=null){

pageNow=Integer.parseInt(sPageNow);

}

//調(diào)用UserBeanC1

UserBeanC1 ubc = new UserBeanC1();

ArrayList al =ubc.getResultByPage(pageNow,pageSize);

pw.println("table border=2");

pw.println("trthid/ththname/ththpasswd/ththmail/ththgrade/thth修改用戶(hù)/thth刪除用戶(hù)/th/tr");

for(int i=0;ial.size();i++){

UserBean ub = (UserBean)al.get(i);

pw.println("tr");

pw.println("td"+ub.getUserId()+"/td");

pw.println("td"+ub.getUserName()+"/td");

pw.println("td"+ub.getPasswd()+"/td");

pw.println("td"+ub.getMail()+"/td");

pw.println("td"+ub.getGrade()+"/td");

pw.println("tda href=??修改/a/td");

pw.println("tda href=delUserC1?userId="+ub.getUserId()+" onclick=\"return window.confirm('確認(rèn)刪除嗎')\"刪除/a/td");

pw.println("/tr");

}

pw.println("/table");

//上一頁(yè)

if(pageNow!=1){

pw.println("a href=wel?pageNowok="+(pageNow-1)+"上一頁(yè)/a");

}

//顯示超鏈接

for(int i=pageNow;i=pageNow+pageSize+1;i++){

pw.println("a href=wel?pageNowok="+i+""+i+"/a");

}

int pageCount=ubc.getPageCount();

//下一頁(yè)

if(pageNow!=pageCount-4){

pw.println("a href=wel?pageNowok="+(pageNow+1)+"下一頁(yè)/abr");

}

pw.println("br該網(wǎng)頁(yè)被訪(fǎng)問(wèn)了"+this.getServletContext().getAttribute("visitTimes").toString()+"次br");

pw.println("您的IP地址是:"+req.getRemoteAddr()+"br");

pw.println("您的機(jī)器名是:"+req.getRemoteHost()+"br");

pw.println("/centerhrimg src=imgs/1.gifbr");

pw.println("/body");

怎樣用java實(shí)現(xiàn)分頁(yè)顯示

實(shí)現(xiàn)原理很簡(jiǎn)單,就是建立一個(gè)Page類(lèi),里面放當(dāng)前訪(fǎng)問(wèn)的頁(yè)數(shù)和每一頁(yè)顯示的記錄行數(shù)。然后通過(guò)分頁(yè)計(jì)算就可以得出下列數(shù)據(jù)。

總頁(yè)數(shù) = 總記錄數(shù)/每頁(yè)大小,如果0!=總記錄數(shù)%每頁(yè)大小,那么總頁(yè)數(shù)再+1。

當(dāng)前頁(yè)數(shù)。

表記錄的起始位置=(當(dāng)前頁(yè)數(shù)-1)*每頁(yè)大小。

總記錄數(shù)(select count(*) from [表名] [where [條件]]。從數(shù)據(jù)庫(kù)中查詢(xún)得到)

每頁(yè)大小,可以固定,也可以從頁(yè)面?zhèn)鬟^(guò)來(lái)有了這幾個(gè)參數(shù)之后,就用sql語(yǔ)句查出對(duì)應(yīng)的記錄就可以了。

Java是一種可以撰寫(xiě)跨平臺(tái)應(yīng)用程序的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。

Java?技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話(huà)和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開(kāi)發(fā)者專(zhuān)業(yè)社群。

它最初被命名為Oak,目標(biāo)設(shè)定在家用電器等小型系統(tǒng)的編程語(yǔ)言,來(lái)解決諸如電視機(jī)、電話(huà)、鬧鐘、烤面包機(jī)等家用電器的控制和通訊問(wèn)題。

由于這些智能化家電的市場(chǎng)需求沒(méi)有預(yù)期的高,Sun放棄了該項(xiàng)計(jì)劃。就在Oak幾近失敗之時(shí),隨著互聯(lián)網(wǎng)的發(fā)展,Sun看到了Oak在計(jì)算機(jī)網(wǎng)絡(luò)上的廣闊應(yīng)用前景,于是改造了Oak,以“Java”的名稱(chēng)正式發(fā)布。

Java的主要工作是通過(guò)編程語(yǔ)言來(lái)制作互聯(lián)網(wǎng)頁(yè)面、制作動(dòng)態(tài)效果以及網(wǎng)站等技術(shù)。

請(qǐng)教java JedisCluster操作redis排序加分頁(yè)問(wèn)題,代碼如下

使用方法代碼樣例如下,使用前,注意打開(kāi)redis的server程序。代碼樣例packageRedisExample;importredis.clients.jedis.Jedis;publicclassTestRedis{publicstaticvoidmain(String[]args){Jedisredis=newJedis("localhost");//SimpleExample(redis);//ListExample(redis,20000);PublishExample(redis,20000);}//簡(jiǎn)單添加信息publicstaticvoidSimpleExample(Jedisredis){redis.set("key1","Iamvalue1");Stringss=redis.get("key1");System.out.println(ss);}//隊(duì)列添加信息publicstaticvoidListExample(Jedisredis,intnumber){StringmessageStr="";intcount=0;while(count++


當(dāng)前標(biāo)題:java代碼排序分頁(yè),java中分頁(yè)
文章網(wǎng)址:http://weahome.cn/article/dseohcd.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部