部分 来源 https://blog.csdn.net/yudaoai/article/details/4278030
物理分页:在数据库执行查询时(实现分页查询),查询需要的数据 ---- 依赖数据库SQL语句,属于后台分页
Mysql /SQLServer / Oracle 每种数据库写法不同的
mysql 使用limit ,SQLServer 使用top ,Oracle使用rowNum
在MySQL数据库中offset关键字的意思是"越过",而limit关键字的意思是“限制”,利用这两者结合可轻松物理分页。
(1)取得符合条件的结果集,包含全字段。
(2)利用offset关键字越过一段结果集(被越过的结果集就是"(当前页 - 1) * 一页显示数")。
(3)利用limit关键字限制取得一段结果集(被限制取得的结果集就是一页显示数)
语法:select * from 表名 LIMIT ? , ?;
第一个参数 ? (当前页数 -1) * 当前页数要显示的数据条数
第二个参数 ? 代表的是实际页数要显示的数据条数(这一页要显示多少数据)
第一页SELECT * FROM product LIMIT 0, 3 --> 0,1,2
第二页SELECT * FROM product LIMIT 3, 3 --> 3,4,5
第三页SELECT * FROM product LIMIT 6, 3 --> 6,7,8
9, 3 ---> 9,10,11
12, 3 ---? 12,13,14
逻辑分页:先查询所有数据到内存,再从内存截取需要数据 ------- 采用程序内部逻辑,属于前台分页
查询所有数据 List, list.subList 截取你需要数据
例如:查询第11到第30条数据 list.subList(开始索引,结束索引); // 前取到,后取不到 ----- list.subList(10,30);
逻辑分页的第一种方式,利用ResultSet的滚动分页。步骤如下:
a.根据条件sql查询数据库。
b.得到ResultSet的结果集,由于ResultSet带有游标,因此可以使用其next()方法来指向下一条记录。
c.利用next()方法,得到分页所需的结果集。
逻辑分页的第二种方式
利用Scrollable ResultSets(可滚动结果集合)来快速定位到某个游标所指定的记录行,所使用的是ResultSet的absolute()方法。
/**
* 逻辑分页方法二,使用absolute()方法分页
*
* @param currentPage
* 当前页
* @param showRows
* 一页显示的数据量
*/
public List pageListTwo(int currentPage, int showRows) {
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
ArrayList resultList = new ArrayList();
try {
con = getConnection();
ps = con.prepareStatement(FIND_BARS_PAGE);
rs = ps.executeQuery();
// 过滤结果集的变量
int skipBegin = (currentPage - 1) * showRows;
int skipEnd = currentPage * showRows;
// 利用rs.absolute进行定位
if (!rs.absolute(skipBegin))
return resultList;
// 当返回结果集中有记录时
while (rs.next()) {
// 以下情况将保证在结果集中有记录时的应用
if (skipBegin < skipEnd) {
Bars bar = new Bars();
bar.setId(rs.getLong("id"));
bar.setName(rs.getString("name"));
bar.setType(rs.getInt("type"));
bar.setCreatorId(rs.getLong("creator_id"));
resultList.add(bar);
if (skipBegin == skipEnd - 1)
break;
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (con != null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return resultList;
}
物理分页每次都访问数据库,逻辑分页只访问一次数据库,物理分页对数据库造成的负担大。
逻辑分页一次性将数据读取到内存,占用了较大的内容空间,物理分页每次只读取一部分数据,占用内存空间较小。
逻辑分页一次性将数据读取到内存,数据发生改变,数据库的最新状态不能实时反映到操作中,实时性差。物理分页每次需要数据时都访问数据库,能够获取数据库的最新状态,实时性强。
逻辑分页主要用于数据量不大、数据稳定的场合,物理分页主要用于数据量较大、更新频繁的场合。