温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SQL Server 2000下JDBC查询分页的解决方案是怎样的

发布时间:2021-12-07 16:23:04 来源:亿速云 阅读:264 作者:柒染 栏目:编程语言

本篇文章给大家分享的是有关SQL Server 2000下JDBC查询分页的解决方案是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

先在项目的classpath中添加msbase.jar,mssqlserver.jar,msutil.jar 怎么来的就不多废话了。需要说的是我***用的SQL Server 2005 JDBC查询驱动sqlJDBC.jar放到项目中,后来的程序是报错的。回头想想,报错有理,SQL Server 2005 已经支持rownum 分页了。

先说说SQL Server 2000的分页的实现,目前实现方法大概是那三种。我个人还是喜欢使用存储过程,原因是使用非常方便,至于使用的存储过程,这里还是放出来看看,估计大家用的都大同小异。

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, --第页记录条数    @pagesize  int --每页显示记录   as    set  nocount  on    declare  @P1  int, --P1是游标的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

这个存储过程的实现,使用了三个系统存储过程sp_cursoropen ,sp_cursorfetch ,sp_cursorclose 从字面上的意思大概是他叫结果集使用游标打开,然后读取其中的@pageSize条记录,所以单从查询上来讲,性能是不及使用select top 之类的实现。

使用起来非常容易,exec Pr_QueryByPage 'select * from yourtable',1,10  就可以了麻烦的是他返回的是三张表。***张表是查询的表,但是没有记录。第二个表一行两列,***个列是总页数,第二个列是总记录条数。第三张表才是需要的数据。这就造成了取的时候有点小麻烦,因为之前只知道,在.net中可以直接fill(DataSet),然后DataSet里面可取DataTable。但是在JDBC里面我映像中ResultSet 只能容一张表。后来找了一些资料,原来PreparedStatement,CallableStatement,Statement都支持查询返回多个ResultSet ,好了,非常好。 下面是我使用CallableStatemnt取到的结果集。

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                      }                  }              }

这样就实现了分页,网上很多人测试了,这个方法的性能不及别的方法,这里我要指出的是,别的方法是不能返回总的记录条数的。而要知道总的记录条数,通常需要select count(*) from ( your sql) 这两次查询叫起来的时间未必会少。

JDBC查询总结

使用上述方法实现SQL Server 2000 JDBC查询分页,使用方便,性能还说的过去。我不知道SQL Server 2005 的查询性能是否又提升。

以上就是SQL Server 2000下JDBC查询分页的解决方案是怎样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI