虽然现在db层的框架很多,用起来也非常的方便,像分页这种非常常用的功能也基本上都有对应的接口可以直接使用。但是有时候数据源不在配置的范围的时候,就必须要使用到jdbc来执行sql,jdbc执行的是原生的sql,所以就没有什么分页接口可以调用了。这时候就要用到两个方法,一个是PreparedStatement的setMaxRows()方法,这个用来设置本次查询返回结果集数的最大数量,另一个是ResultSet的absolute()方法,这个用来设置结果集偏移的位置,当然还有一个ResultSet的relative()方法,这个方法和absolute()类似,只是一个是相对于整个结果集,一个是相对与当前位置。下面是实例:

  1. public ResultSet getPageByAbsolute(String sql,
  2. int pageNo,int pageSize) throws SQLException {
  3. PreparedStatement pre = getConn().prepareStatement(sql);
  4. pre.setMaxRows(pageNo*pageSize);
  5. ResultSet rs = pre.executeQuery();
  6. rs.absolute((pageNo - 1)*pageSize);
  7. return rs;
  8. }
 

ResultSet的游标会比结果集多两个,一个是最头,一个是最尾,所以在做偏移的时候要考虑到这两个游标,ResultSet的游标是从0开始的,比如现在要查询每页数量为20条的第2页的数据,那么就需要跳过前21个下标,从游标21开始才是第二页的数据,按照上面的方法只偏移了20,返回的rs的当前游标位置为20,所以在使用的时候需要再执行一下ResultSet的next()方法才是第二页的数据,考虑到一般在使用rs的时候都是while(rs.next()){。。。}这种方式,所以这样正好可以正确的获取到数据,relative()方法在这里体现不出它的功能特性,而且分页的话用absolute()方法就足够了,上面的方法把absolute换成relative也是一样的效果,因为一开始的当前位置就是0,跟absolute相对的位置是一样的。
在使用的时候要特别注意的是PreparedStatement 对象在创建的时候一定要加上ResultSet.TYPE_SCROLL_SENSITIVE和ResultSet.CONCUR_READ_ONLY这两个参数,如下:
PreparedStatement pre = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
不然的话会报java.sql.SQLException: 对只读结果集的无效操作的异常。

jdbc分页查询的更多相关文章

  1. JDBC分页查询及实现

    当数据过多时,一页之内是无法显示的,因此需要进行分页显示. (一)分页技术实现: 物理分页: - 在数据库执行查询时(实现分页查询),查询需要的数据--依赖数据库的SQL语句 - 在sql查询时,从数 ...

  2. jdbc之分页查询

    分页查询作为一项十分重要的数据库查询技术,在很多web项目中都会要用到,当然移动开发中也是会涉及的. 一.分页查询的sql语句: ps:为了方便阐述,下面统一使用student表作为查询的表:colN ...

  3. 分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)

             分页查询信息       使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目 ...

  4. JDBC在Java Web中的应用——分页查询

    分页查询 通过JDBC实现分页查询的方法有很多种,而且不同的数据库机制也提供了不同的分页方式,在这里介绍两种非常典型的分页方法. 通过ResultSet的光标实现分页 通过ResultSet的光标实现 ...

  5. JDBC使用游标实现分页查询的方法

    本文实例讲述了JDBC使用游标实现分页查询的方法.分享给大家供大家参考,具体如下: /** * 一次只从数据库中查询最大maxCount条记录 * @param sql 传入的sql语句 * @par ...

  6. JdbcTemplate+PageImpl实现多表分页查询

    一.基础实体 @MappedSuperclass public abstract class AbsIdEntity implements Serializable { private static ...

  7. MyBatis简单的增删改查以及简单的分页查询实现

    MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...

  8. Java GUI+mysql+分页查询

    1.要求 : 创建一个学生信息管理数据库 2.实现分页查询 代码如下: a)学生实体类: /** * @author: Annie * @date:2016年6月23日 * @description: ...

  9. 基于Mysql数据库的SSM分页查询

    前言: Hello,本Y又来了,"分页"在我们使用软件的过程中是一个很常见的场景,比如博客园对于每个博主的博客都进行了分页展示.可以简单清晰的展示数据,防止一下子将过多的数据展现给 ...

随机推荐

  1. Django学习系列之CSRF

    Django CSRF 什么是CSRF CSRF, Cross Site Request Forgery, 跨站点伪造请求.举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果 某个用户已经登录到 ...

  2. javascript 閉包

    這兩種寫法都是可以的. 第一種: function a(){ var m=[]; for(var i=1; i<10; i++){ (function(i){ function b(){ con ...

  3. mysql正则表达式及应用

    mysql where子句的模式匹配 今天在应用中遇到了这样的一个问题,有一个字段 t1,其中的值类似于:1,1,1,2,3,3,4,4,5,5,2,4,3,2,1,2 需要从里面搜索出比如说:第一个 ...

  4. php生成二维码2

    <?php include "phpqrcode.php"; $value = "http://huizhongda.taobao.com/"; $err ...

  5. BZOJ 3041 水叮当的舞步

    3041: 水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 120  Solved: 67[Submit][Status][Discuss ...

  6. 阳性比例 mysql CASE UNION ALL

    阳性比例 mysql CASE UNION ALL SELECT t.*,t.type_0/all_ FROM ( SELECT FROM_UNIXTIME(create_time,'%Y-%m-%d ...

  7. CollapsingToolbarLayout Toolbar的title覆盖问题

    CollapsingToolbarLayout 里: 1 2 app:titleEnabled="true" app:title="Hello" Toolbar ...

  8. 洛谷 P1573 栈的操作

    题目描述 现在有四个栈,其中前三个为空,第四个栈从栈顶到栈底分别为1,2,3,-,n.每一个栈只支持一种操作:弹出并压入.它指的是把其中一个栈A的栈顶元素x弹出,并马上压入任意一个栈B中.但是这样的操 ...

  9. bzoj1999 (洛谷1099) 树网的核——dfs

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999  https://www.luogu.org/problemnew/show/P109 ...

  10. [odb-users] Create schema error (unknown database schema '')

    Boris Kolpackov boris at codesynthesis.comFri May 31 11:13:02 EDT 2013 Previous message: [odb-users] ...