当数据过多时,一页之内是无法显示的,因此需要进行分页显示。
(一)分页技术实现:
物理分页:
- 在数据库执行查询时(实现分页查询),查询需要的数据—-依赖数据库的SQL语句
- 在sql查询时,从数据库只检索分页需要的数据
- 通常不同的数据库有着不同的物理分页语句
- 物理分页:Mysql/SQL Server/Oracle,每种数据数的写法是不同的
- mysql物理分页,采用limit关键字,SQL Server采用top,Oracle采用rowNum
- 例如,检索11-20条:select * from user limit 10,10;
注意,索引从0开始,第一个10代表第11条,上述语句的含义是查询第11条到第20条
逻辑分页:
- 先查询所有数据到内存,再从内存截取需要的数据—-采用程序内部逻辑(先都查出来,再进行选择)
- 在sql查询时,先从数据库检索出所有数据的结果集
- 在程序内,通过逻辑语句获得分页需要的数据
- 例如,检索11-20条:userList.subList(10,20);
- ResultSet是JDBC API中封装的查询结果集对象,通过该对象可以实现数据的分页显示。通过ResultSet的光标实现分页,优点是在各种数据库上通用,缺点是占用大量资源,不适合数据量大的情况。(由于ResultSet分页存在性能方面的缺陷,在实际开发中,很多情况都是采用数据库提供的分页机制来实现分页查询功能)
(二)实例
通过MySQL数据库提供的分页机制,实现商品信息的分页查询功能,将分页数据显示在JSP页面
(1)JavaBean:用于封装商品信息
public class Product{
public static final int PAGE_SIZE = 2//每页记录数
private int id;//编号
private String name;//名称
private double price;//价格
private int num;//数量
private String unit;//单位
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
}
由于每页记录数一般不会修改,因此将其定义为final类型(静态的final类型变量,通常情况下我们大写)。
按照DAO模式,接下来我们分别编写数据层和业务层
(2)创建名称为BookDao的类,用于封装数据库相关操作。
package com.megustas.bean;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
* 商品数据库操作
*