您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)SQL Server 2000下JDBC查詢分頁的解決方案是怎樣的,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
先在項(xiàng)目的classpath中添加msbase.jar,mssqlserver.jar,msutil.jar 怎么來的就不多廢話了。需要說的是我***用的SQL Server 2005 JDBC查詢驅(qū)動(dòng)sqlJDBC.jar放到項(xiàng)目中,后來的程序是報(bào)錯(cuò)的?;仡^想想,報(bào)錯(cuò)有理,SQL Server 2005 已經(jīng)支持rownum 分頁了。
先說說SQL Server 2000的分頁的實(shí)現(xiàn),目前實(shí)現(xiàn)方法大概是那三種。我個(gè)人還是喜歡使用存儲(chǔ)過程,原因是使用非常方便,至于使用的存儲(chǔ)過程,這里還是放出來看看,估計(jì)大家用的都大同小異。
IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Pr_QueryByPage]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1) BEGIN EXEC dbo.sp_executesql @statement = N'create procedure [dbo].[Pr_QueryByPage] @sqlstr nvarchar(4000), --查詢sql @currentpage int, --第頁記錄條數(shù) @pagesize int --每頁顯示記錄 as set nocount on declare @P1 int, --P1是游標(biāo)的ID @rowcount int exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output select ceiling(1.0*@rowcount/@pagesize) as TotalPage,@rowcount as [RowCount] set @currentpage=(@currentpage-1)*@pagesize+1 exec sp_cursorfetch @P1,16,@currentpage,@pagesize exec sp_cursorclose @P1 set nocount off ' END GO
這個(gè)存儲(chǔ)過程的實(shí)現(xiàn),使用了三個(gè)系統(tǒng)存儲(chǔ)過程sp_cursoropen ,sp_cursorfetch ,sp_cursorclose 從字面上的意思大概是他叫結(jié)果集使用游標(biāo)打開,然后讀取其中的@pageSize條記錄,所以單從查詢上來講,性能是不及使用select top 之類的實(shí)現(xiàn)。
使用起來非常容易,exec Pr_QueryByPage 'select * from yourtable',1,10 就可以了麻煩的是他返回的是三張表。***張表是查詢的表,但是沒有記錄。第二個(gè)表一行兩列,***個(gè)列是總頁數(shù),第二個(gè)列是總記錄條數(shù)。第三張表才是需要的數(shù)據(jù)。這就造成了取的時(shí)候有點(diǎn)小麻煩,因?yàn)橹爸恢溃?net中可以直接fill(DataSet),然后DataSet里面可取DataTable。但是在JDBC里面我映像中ResultSet 只能容一張表。后來找了一些資料,原來PreparedStatement,CallableStatement,Statement都支持查詢返回多個(gè)ResultSet ,好了,非常好。 下面是我使用CallableStatemnt取到的結(jié)果集。
CallableStatement cs = conn.prepareCall("exec Pr_QueryByPage 'select * from ckdmzd',1,10"); ResultSet rs = null; /** * execute returns : * true : returns ResultSet(s) * false: returns rows affected */ boolean hasResultSet = cs.execute(); if(hasResultSet){ /** * skip the first ResultSet */ rs=cs.getResultSet(); /** * second ResultSet : pageCount & recordCount */ if(cs.getMoreResults()){ rs=cs.getResultSet(); while(rs.next()){ String pageCount=rs.getString(1); String recordCount=rs.getString(2); } } /** * the thrid one is the paged result */ if(cs.getMoreResults()){ rs=cs.getResultSet(); while(rs.next()){ // do somthing with ResultSet } } }
這樣就實(shí)現(xiàn)了分頁,網(wǎng)上很多人測(cè)試了,這個(gè)方法的性能不及別的方法,這里我要指出的是,別的方法是不能返回總的記錄條數(shù)的。而要知道總的記錄條數(shù),通常需要select count(*) from ( your sql) 這兩次查詢叫起來的時(shí)間未必會(huì)少。
JDBC查詢總結(jié)
使用上述方法實(shí)現(xiàn)SQL Server 2000 JDBC查詢分頁,使用方便,性能還說的過去。我不知道SQL Server 2005 的查詢性能是否又提升。
以上就是SQL Server 2000下JDBC查詢分頁的解決方案是怎樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。