分页
前端分页
前端分页一般用于数据量较小的情况,一次请求把数据全部从后端请求回来,然后通过组件进行自动分页。下面是ant design的分页组件写法:
<div>
<a-table :columns="historySubjectColumns"
:data-source="historySubjectList"
rowKey="id"
:pagination="pagination"
:scroll="{y: 400}">
</a-table>
</div>
<script lang="ts">
import {defineComponent} from "vue";
export default defineComponent({
data(){
return{
//分页
pagination: {
current:1,
defaultPageSize:10,
hideOnSinglePage:false,
pageSize:10,
total:0,
showTotal: (total: number) => `总共 ${total} 条数据`,
onChange:(page:number,pageSize:number) => this.pageChange(page,pageSize)
}
}
},
methods: {
pageChange(page:number,pageSize:number){
this.pagination.current = page
this.pagination.pageSize = pageSize
}
}
})
</script>
当页码数发生变化时,回调onChange被调用。
pagination.current表示当前页码。
后端分页
后端分页适用于数据量偏大时的情况,减小请求传输压力。前端需要将每页条数和当前页传给后端,后端根据条件查询出数据再传给前端,包括总条数、当前页、每页多少条数据等。
- 前端显示的当前页和每页多少条数据由后端传回的数据决定,否则出现改变前端参数,还未发请求时,页码的错乱。
- 当改变每页多少条时,当前页参数置为首页。
逻辑分页
先查询所有满足条件的数据,然后进行分页处理。
Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。
分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,,根据dialect方言,添加对应的物理分页语句和物理分页参数。
物理分页
1.原生SQL解析
2.判断有无page分页对象。没有对象就直接进行SQL操作,有对象就继续分页解析
3.count语句优化。根据SQL条件进行count优化,这点不同于传统的 select count(1)from(你的业务SQL)做下简单的封装,详细源码可以自己看,或者打印出执行的SQL可以洁楚的看到
4.通过count数量和之前前端传递来的分页pageNum和pageSize对SQL进行拼接
5.最终执行拼接完整的SQL实现分页处理