分页思想方法

分页

分页实现:
后台需要的5个变量(属性)

  1. 数据总数: 100 103 (查数据库,select count(*)…)
  2. 页面大小(每页显示的数据条数): 20 (用户自定义)
  3. 总页数 (程序自动计算)
    总页数 = 100/20 =数据总数/页面大小
    总页数 = 103/20 = 数据总数/页面大小+1
    –通式–> 总页数 = 数据总数%页面大小==0? 数据总数/页面大小:数据总数/页面大小+1 ;
  4. 当前页(页码) (用户自定义)
  5. 当前页的对象集合(实体类集合) 每页所显示的所有数据 (如:10个人信息)
    结果集: List (查数据库,分页sql)
    在这里插入图片描述

示例简介

要实现分页,必须知道 某一页的 数据 从哪里开始 到哪里结束
页面大小:每页显示的数据量
假设每页显示10条数据
在这里插入图片描述

不同数据库的分页查询sql

mysql分页:

mysql:从0开始计数
第n页 开始 结束
1 0 9
2 10 19
3 20 29
n (n-1)10 n10-1

MYSQL实现分页的sql:
limit 开始,多少条
第0页
select * from student limit 0,10 ;
第1页
select * from student limit 10,10 ;
第2页
select * from student limit 20,10 ;
第n页
select * from student limit n*10,10

mysql的分页语句:

【select * from student limit (页数-1)*页面大小,页面大小】

oracle分页

在这里插入图片描述
sqlserver/oracle:从1开始计数
第n页 开始 结束
1 1 10
2 11 20
3 21 30
n (n-1)10+1 n10
结论:
分页:
第n页的数据: 第(n-1)10+1条 – 第n10条
select *from student where sno >=(n-1)10+1 and sno <=n10 ;
–此种写法的前提:必须是Id连续 ,否则 无法满足每页显示10条数据

select rownum,t.*from student t where rownum >=(n-1)10+1 and rownum <=n10 order by sno;
–1.如果根据sno排序则rownum会混乱(解决方案:分开使用->先只排序,再只查询rownum)
–2.rownum不能查询>的数据

select s.* from student s order by sno asc;

select rownum, t.* from
(select s.* from student s order by sno asc) t
where rownum >=(n-1)10+1 and rownum <=n10 ; ;

//ORACLE\sqlserver都是从1开始计数: (n-1)10+1 — n10
oracle的分页查询语句:
select from
(
select rownum r, t.
from
(select s.* from student s order by sno asc) t 10000
)
where r>=(n-1)10+1 and <=n10 ; 10

优化:

select from
(
select rownum r, t.
from
(select s.* from student s order by sno asc) t
where rownum<=n*10
)
where r>=(n-1)*10+1 ;

通式

select from
(
select rownum r, t.
from
(select s.* from student s order by sno asc) t
where rownum<=页数*页面大小
)
where r>=(页数-1)*页面大小+1 ;

sqlserver的分页

在这里插入图片描述
在这里插入图片描述
row_number() over(字段) ;

sqlserver2003:top --此种分页SQL存在弊端(如果id值不连续,则不能保证每页数据量相等)
select top 页面大小 * from student where id not in
( select top (页数-1)*页面大小 id from student order by sno asc )

sqlserver2005之后支持:
select from
(
select row_number() over (sno order by sno asc) as r,
from student
where r<=n*10
)
where r>=(n-1)10+1 and r<=n10 ;

SQLServer此种分页sql与oralce分页sql的区别: 1.rownum ,row_number() 2.oracle需要排序(为了排序,单独写了一个子查询),但是在sqlserver 中可以省略该排序的子查询 因为sqlserver中可以通过over直接排序

sqlserver2012之后支持:
offset fetch next only

通式

select * from student oreder by sno
offset (页数-1)*页面大小+1 rows fetch next 页面大小 rows only ;

(n-1)10+1 — n10

总结

mysql从0开始计数,Oracle/sqlserver 从1开始计数

分页框架

jpa有自己的分页实现,mybatis需要用上PageHelper【原理是使用了AOP,在进行查询时加上limit x,x关键字(mysql的分页查询)】插件实现分页

SpringBoot 整合JPA | PageHelper 的分页最简实现

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值