Oracle实现分页

1.依赖Oracle数据库sql语句实现分页


SQL代码:
SELECT first_name,salary
FROM (SELECT rownum rn,first_name,salary
      FROM (SELECT first_name,salary
             FROM employees ORDER BY first_name)
      WHERE rownum<?)
WHERE rn>=?

说明:以下①②参见(SQL执行顺序http://blog.youkuaiyun.com/ml1990s/article/details/11538483
          ①为保证查询出的结果是排序后的,所以在最里层查询必须使用ORDER BY子句,使用了三层查询结构。
          因为如果第二层查询的WHERE子句与ORDER BY子句同时出现,会先执行WHERE子句,再执行ORDER BY子句,这样结果就不是先排序后的查询结果了。若不要求排序,完全可以使用两层查询。

          ②第二层查询的WHERE子句中不能使用rn别名代替rownum。
          因为SQL语句执行顺序是先执行FROM子句,再执行WHERE子句,最后执行SELECT各项。所以只有FROM子句中已经查询出来的(或存在的数据)WHERE子句才可以使用。

          ③第一个“?”代表结束行数据(不包含);第二个“?”代表开始行数据(包含)

          ④根据SQL语句相关计算公式:
                   int page ;       //当前页码
                   int pageSize; //每页显示数据条数
                   int startRow = (page-1)*pageSize +1;  //开始行
                   int endRow = page*pageSize+1;          //结束行

2.依赖结果集,进行分页

相对1该方法缺点数据一次性取出,性能耗损大;数据更新后,结果集不能及时更新

java代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class PageByResult {
  private static final String DRIVER = "oracle.jdbc.OracleDriver";
  private static final String url = "jdbc:oracle:thin:@localhost:1521:XE";
  private static final String USERNAME = "test";
  private static final String PASSWORD = "test";

  public static void main(String[] args) throws Exception {
   
    Class.forName(DRIVER);
    Connection conn = DriverManager.getConnection(url, USERNAME, PASSWORD);
    String sql = "SELECT student_id,student_name FROM students ORDER BY student_id";
    /*
     * 创建可以滚动的结果集: TYPE_SCROLL_INSENSITIVE :可滚动结果集,对记录的更改不敏感
     * CONCUR_READ_ONLY:结果集合只可以读取,但不能进行更新操作
     */

    PreparedStatement pstmt = conn.prepareStatement(sql,
        ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

    ResultSet rs = pstmt.executeQuery();
    System.out.println("停止数据库服务");
    Thread.sleep(50000);//即使在此时停止数据库,结果集以下代码仍能正常运行,结果集仍能进行排序
    System.out.println("开始输入页数");

    java.util.Scanner sc = new java.util.Scanner(System.in);
    while(sc.hasNextInt()){
        int pageSize = 2; 
        int page =  sc.nextInt(); //输入当前页码
        int startRow = (page - 1) * pageSize + 1; //计算开始行
        
        for (int i = 0; i < pageSize; i++) {  

          rs.absolute(startRow);//对结果集滚动,定位到开始行记录数据,开始取出数据
          String studentName = rs.getString("student_name");
          String studentId = rs.getString("student_id");
          System.out.println(studentId+"<->"+studentName);
          startRow++;//取毕该行数据记录后开始下一行数据读取
        }
        
    }
    
    
    
    
   

  }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值