您的位置:首页 > 数据库 > Oracle

Oracle实现分页

2013-09-10 21:14 211 查看

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执行顺序/article/9994944.html
①为保证查询出的结果是排序后的,所以在最里层查询必须使用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++;//取毕该行数据记录后开始下一行数据读取
}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: