新聞中心
先在項(xiàng)目的classpath中添加msbase.jar,mssqlserver.jar,msutil.jar 怎么來(lái)的就不多廢話了。需要說(shuō)的是我***用的SQL Server 2005 JDBC查詢(xún)驅(qū)動(dòng)sqlJDBC.jar放到項(xiàng)目中,后來(lái)的程序是報(bào)錯(cuò)的。回頭想想,報(bào)錯(cuò)有理,SQL Server 2005 已經(jīng)支持rownum 分頁(yè)了。

創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供霸州企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為霸州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。
先說(shuō)說(shuō)SQL Server 2000的分頁(yè)的實(shí)現(xiàn),目前實(shí)現(xiàn)方法大概是那三種。我個(gè)人還是喜歡使用存儲(chǔ)過(guò)程,原因是使用非常方便,至于使用的存儲(chǔ)過(guò)程,這里還是放出來(lái)看看,估計(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), --查詢(xún)sql
- @currentpage int, --第頁(yè)記錄條數(shù)
- @pagesize int --每頁(yè)顯示記錄
- 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ǔ)過(guò)程的實(shí)現(xiàn),使用了三個(gè)系統(tǒng)存儲(chǔ)過(guò)程sp_cursoropen ,sp_cursorfetch ,sp_cursorclose 從字面上的意思大概是他叫結(jié)果集使用游標(biāo)打開(kāi),然后讀取其中的@pageSize條記錄,所以單從查詢(xún)上來(lái)講,性能是不及使用select top 之類(lèi)的實(shí)現(xiàn)。
使用起來(lái)非常容易,exec Pr_QueryByPage 'select * from yourtable',1,10 就可以了麻煩的是他返回的是三張表。***張表是查詢(xún)的表,但是沒(méi)有記錄。第二個(gè)表一行兩列,***個(gè)列是總頁(yè)數(shù),第二個(gè)列是總記錄條數(shù)。第三張表才是需要的數(shù)據(jù)。這就造成了取的時(shí)候有點(diǎn)小麻煩,因?yàn)橹爸恢溃?net中可以直接fill(DataSet),然后DataSet里面可取DataTable。但是在JDBC里面我映像中ResultSet 只能容一張表。后來(lái)找了一些資料,原來(lái)PreparedStatement,CallableStatement,Statement都支持查詢(xún)返回多個(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)了分頁(yè),網(wǎng)上很多人測(cè)試了,這個(gè)方法的性能不及別的方法,這里我要指出的是,別的方法是不能返回總的記錄條數(shù)的。而要知道總的記錄條數(shù),通常需要select count(*) from ( your sql) 這兩次查詢(xún)叫起來(lái)的時(shí)間未必會(huì)少。
JDBC查詢(xún)總結(jié)
使用上述方法實(shí)現(xiàn)SQL Server 2000 JDBC查詢(xún)分頁(yè),使用方便,性能還說(shuō)的過(guò)去。我不知道SQL Server 2005 的查詢(xún)性能是否又提升。
【編輯推薦】
- 使用JDBC的五個(gè)精華功能
- Tomcat5+MySQL JDBC連接池配置
- 在Weblogic中實(shí)現(xiàn)JDBC的功能
- 詳解JDBC與Hibernate區(qū)別
- JDBC連接MySQL數(shù)據(jù)庫(kù)關(guān)鍵四步
- 淺談JDBC DAO的設(shè)計(jì)理念
當(dāng)前題目:淺談SQL Server 2000下JDBC查詢(xún)分頁(yè)解決方案
當(dāng)前地址:http://m.5511xx.com/article/dpejcdd.html


咨詢(xún)
建站咨詢(xún)
