浅谈SQL Server 2000下JDBC查询分页解决方案

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

创新互联是一家专业提供霸州企业网站建设,专注与网站设计制作、做网站H5高端网站建设、小程序制作等业务。10年已为霸州众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。

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

 
 
 
  1. IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Pr_QueryByPage]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)  
  2. BEGIN  
  3. EXEC dbo.sp_executesql @statement = N'create    procedure  [dbo].[Pr_QueryByPage]    
  4. @sqlstr  nvarchar(4000),  --查询sql    
  5. @currentpage  int, --第页记录条数    
  6. @pagesize  int --每页显示记录   
  7. as    
  8. set  nocount  on    
  9. declare  @P1  int, --P1是游标的ID    
  10. @rowcount  int    
  11. exec  sp_cursoropen  @P1  output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount  output    
  12. select  ceiling(1.0*@rowcount/@pagesize)  as TotalPage,@rowcount as [RowCount]   
  13. set  @currentpage=(@currentpage-1)*@pagesize+1    
  14. exec  sp_cursorfetch  @P1,16,@currentpage,@pagesize      
  15. exec  sp_cursorclose  @P1    
  16. set  nocount  off  '   
  17. END  
  18. 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取到的结果集。

 
 
 
  1. CallableStatement cs = conn.prepareCall("exec Pr_QueryByPage 'select * from ckdmzd',1,10");  
  2.             ResultSet rs = null;  
  3.             /**  
  4.             * execute returns :  
  5.             *    true : returns ResultSet(s)  
  6.             *  false: returns rows affected  
  7.             */  
  8.             boolean hasResultSet = cs.execute();  
  9.             if(hasResultSet){  
  10.                 /**  
  11.                 * skip the first ResultSet  
  12.                 */  
  13.                 rs=cs.getResultSet();  
  14.                 /**  
  15.                 * second ResultSet : pageCount & recordCount  
  16.                 */  
  17.                 if(cs.getMoreResults()){  
  18.                     rs=cs.getResultSet();  
  19.                     while(rs.next()){  
  20.                         String pageCount=rs.getString(1);  
  21.                         String recordCount=rs.getString(2);  
  22.                     }  
  23.                 }  
  24.                 /**  
  25.                 * the thrid one is the paged result  
  26.                 */  
  27.                 if(cs.getMoreResults()){  
  28.                     rs=cs.getResultSet();  
  29.                     while(rs.next()){  
  30.                         // do somthing with ResultSet  
  31.                     }  
  32.                 }  
  33.             } 

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

JDBC查询总结

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

【编辑推荐】

  1. 使用JDBC的五个精华功能
  2. Tomcat5+MySQL JDBC连接池配置
  3. 在Weblogic中实现JDBC的功能
  4. 详解JDBC与Hibernate区别
  5. JDBC连接MySQL数据库关键四步
  6. 浅谈JDBC DAO的设计理念

文章标题:浅谈SQL Server 2000下JDBC查询分页解决方案
网址分享:http://www.gawzjz.com/qtweb/news33/191933.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联