SpringMVC分页查询和显示

分享人:田文瑞

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

9.鸣谢

1.背景介绍

SpringMVC分页查询背景

场景:

当线上研发代码编写不规范,使用mybatis编写sql语句时使用万能匹配查询语句:where 1 = 1 之后,如果拼接的if条件都不符合条件,就会出现sql语句查全表的情况,在这种情况下就会导致数据过多,塞满内存,不断GC(垃圾收集),导致整个服务宕掉。

解决办法:

第一种:使用分页查询,引用Limit,限制查询出的数据条数 服务器性能、资源:如果数据量过大时,使用分页查询后,可以避免一次查询全表数据过多,硬生生把内存塞满,不断GC,整个服务宕掉的情况。 用户体验:分页查询可以使页面显示更加美观整洁。

2.知识剖析

SpringMVC分页分类

一、概述
1.物理分页

物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的就是分页结果。

2.逻辑分页

逻辑分页依赖的是程序员编写的代码。数据库返回的不是分页结果,而是全部数据,然后再由程序员通过代码获取分页数据,常用的操作是一次性从数据库中查询出全部数据并存储到List集合中,因为List集合有序,再根据索引获取指定范围的数据。

二、对比

三、实现

limit的语法select * from table where ... limit start,size;

start:从第几条记录开始。

size : 读取几条记录。

首先需要知道,从第几条[下标]开始读,要往后读取多少条。

即分页显示的话,需要传给sql语句两个参数,某一页面中第一条在表中的下标,以及页面中数据的条数。

size:默认指定一个,或者从前台输入后取一个。

start下标:前端传过来要跳转到的页码,后台sql中加入(pageNum-1)*size的计算,即为对应页面的start下标值。

另一种方式是一种方式是,前端js计算完,直接传值过来。不涉及sql语句的计算。

3.常见问题

SpringMVC分页常见问题

1、limit分页实现需要哪些参数?

2、前端怎么传过来要跳转的页码?传过来后后端如何接收?

3、ssm框架实现分页还有哪种方式

4.解决方案

SpringMVC分页常见问题解决

1、limit分页实现需要哪些参数?

select * from table where ... limit start,size;

size:每页显示多少条 (pageRows)

start:每页的起始行号(beginRownum)

每页的起始行号(beginRownum) = 当前页数(pageNum - 1)* 每页条数(pageRows)

beginRownum = (pageNum - 1) * pageRows;

SpringMVC分页常见问题解决

1、limit分页实现需要哪些参数?

select * from table where ... limit start,size;

总条数(totalRows)/每页条数(pageRows)=总页数(totalPages)有无余数 url中传值负数跳页面

totalPages = totalRows % pageRows == 0 ? totalRows / pageRows : (totalRows / pageRows) + 1

SpringMVC分页常见问题解决

2、前端怎么传过来要跳转的页码?传过来后后端如何接收? 见代码

SpringMVC分页常见问题解决

3、ssm框架实现分页还有哪种方式

PageHelp分页插件

5.编码实战

6.扩展思考

Limit分页优化

1、分段 每次只能翻100页,超过一百页的需要重新加载后面的100页,解决每次加载数据量过大,速度慢

2、子查询优化 记录每次取出的最大id :Select * From test Where ID>=(Select ID From test limit 90000,1)limit 100 比较 Select * From test limit 90000,1

6.扩展思考

Limit分页优化

3、做索引

.......

7.参考文献

https://www.cnblogs.com/kunpengv5/p/10025069.html https://blog.csdn.net/lvoelife/article/details/81943070

8.更多讨论

9.鸣谢

感谢观看,如有出错,恳请指正