分页

前端分页

前端分页一般用于数据量较小的情况,一次请求把数据全部从后端请求回来,然后通过组件进行自动分页。下面是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实现分页处理

posted @ 2022-10-13 10:10  OraCat  阅读(40)  评论(0编辑  收藏  举报