目录
一、前言
数据分页是指将一批数据按照指定的大小分割成多个页面或数据块,每个页面或数据块包含一部分数据,用于分批显示和处理数据。数据分页通常用于网站、应用程序等需要处理大量数据的场景,以提高数据的加载速度和响应速度。
数据分页的核心思想是将大数据集合分割成多个小数据集合,每个小数据集合包含指定数量的数据,例如每页显示10条数据。在显示数据时,将数据按照指定的顺序和格式进行分页,每次显示一个页面或数据块。当需要访问下一页数据时,再加载下一个页面或数据块,以此类推。这样可以减少一次性加载大量数据的压力,提高数据的响应速度和用户体验。
二、RuoYi中的数据分页案例
在登录日志中,我们可以看到若依界面处理数据,在一个界面展示不过来的情况下会选择采纳多页处理,其中就使用到了数据分页,以下就是若依中的登录日志的分页效果。
三、源码分析
1、前端代码
在src->views->monitor->logininfor->index.vue我们可以看到登录日志的前端代码,其中的<pagination/> 为分页组件。
初始化了total为0 所返回的total的值取决于后台所传来的数据条数; @pagination所绑定的getList方法 负责处理所返回的数据 实现分页功能。
其中getList方法中调用了List函数
其中返回的rows和total将赋值给logininfor->index.vue中js定义的list和total
2、后端代码
startPage()和getDataTable(List)分别起到了分页功能的实现和返回数据库数据的功能。任何分页功能的实现都需先执行startPage()这个方法。
在PageInfo(list)中可以看到 调用了父类构造器
MyBatis 通过修改SQL 语句,多请求了一句SQL 语句:SELECT count(0) FROM sys_logininfor返回了总行数给到Page 对象的total 成员。然后通过子类Page 强转父类List 对象,访问其成员total 值,赋值给PageInfo 父类成员total,即this.total = ((Page)list).getTotal();
可以看到的后端log输出结果
22:56:49.837 [http-nio-8080-exec-29] DEBUG c.r.s.m.S.selectLogininforList_COUNT - [debug,137] - ==> Preparing: SELECT count(0) FROM sys_logininfor
22:56:49.837 [http-nio-8080-exec-29] DEBUG c.r.s.m.S.selectLogininforList_COUNT - [debug,137] - ==> Parameters:
22:56:49.840 [http-nio-8080-exec-29] DEBUG c.r.s.m.S.selectLogininforList_COUNT - [debug,137] - <== Total: 1
22:56:49.842 [http-nio-8080-exec-29] DEBUG c.r.s.m.S.selectLogininforList - [debug,137] - ==> Preparing: select info_id, user_name, ipaddr, login_location, browser, os, status, msg, login_time from sys_logininfor order by info_id desc LIMIT ?
22:56:49.843 [http-nio-8080-exec-29] DEBUG c.r.s.m.S.selectLogininforList - [debug,137] - ==> Parameters: 10(Integer)
22:56:49.844 [http-nio-8080-exec-29] DEBUG c.r.s.m.S.selectLogininforList - [debug,137] - <== Total: 10
SQL 被MyBatis 拦截改变了,selectOperLogList 函数对应两句SQL:
- 一句查询表的总行数[count(0)]
- 一句对查询数据做了行数输出限制[LIMIT 10]
count(0):表数据的总行数
LIMIT 有两种形式:
- LIMIT num:数据的前num 个
- LIMIT offset,num:从offset 偏移位置开始的num 个数据
当我们选择第二页的时候,后端输出log为
22:37:13.786 [http-nio-8080-exec-28] DEBUG c.r.s.m.S.selectLogininforList_COUNT - [debug,137] - ==> Preparing: SELECT count(0) FROM sys_logininfor
22:37:13.786 [http-nio-8080-exec-28] DEBUG c.r.s.m.S.selectLogininforList_COUNT - [debug,137] - ==> Parameters:
22:37:13.789 [http-nio-8080-exec-28] DEBUG c.r.s.m.S.selectLogininforList_COUNT - [debug,137] - <== Total: 1
22:37:13.790 [http-nio-8080-exec-28] DEBUG c.r.s.m.S.selectLogininforList - [debug,137] - ==> Preparing: select info_id, user_name, ipaddr, login_location, browser, os, status, msg, login_time from sys_logininfor order by info_id desc LIMIT ?, ?
22:37:13.791 [http-nio-8080-exec-28] DEBUG c.r.s.m.S.selectLogininforList - [debug,137] - ==> Parameters: 10(Long), 10(Integer)
22:37:13.795 [http-nio-8080-exec-28] DEBUG c.r.s.m.S.selectLogininforList - [debug,137] - <== Total: 10
先SELECT count(0)从后台数据库sys_loginifor取出所有数据,然后再去筛选相应的数据值;limit后面的10(Long)作用是显示当前页面比如此时我取到第二页面之前也有储存的数据多少,因为是第二页面所以已经储存了10个数据,即是10(Long);而后面的10(Integer)的作用就是等价于PageSize就是每页数据多少;Total:10就是表示当前页面数据总量多少。
四、总结
在实际过程中可以使用数据分页,加快数据的加载,提高内存的使用率,而且因为是实时读取,在后端的数据进行改变的时候也能进行及时的更新,在众多优秀的项目中都有使用到数据分页这一技术。
标签:nio,22,RuoYi,debug,137,二次开发,数据,分页 From: https://blog.csdn.net/asd2022714/article/details/144209603