分页展示
从页面中可以看出,若依处理大量数据时,通过分页进行数据展示
源码分析
前端
- 打开字典管理源码文件,<pagination>组件为分页组件
- v-show: 在总条数为0时,不显示该分页内容
- @pagination: 当前页数或每页条数进行改变时,就触发getList()方法
- 若依中,<pagination>组件实际上是将<el-pagination>组件进行封装,进行全局组件挂载
- 当前页或每页数量改变时,触发getList()方法,getList()方法会调用listType()方法发送请求到后端获取数据,从后端获取到的数据进行相关数据的赋值处理
- 通过开发者工具进行后端数据查看,其中,pageNum为第几页,pageSize为每页条数
后端
- 后端响应代码,实现分页需要执行startPage()方法进行设置分页参数,getDataTable()将返回的参数进行封装
startPage() 方法
- 实现分页设置
- 首先,SysDictTypeController类继承了BaseController类,调用startPage()方式时,实际上调用了父类的startPage()方法
- 其次,BaseController类的startPage()方法又嗲用了PageUtils类的静态方法startPage(),而PageUtils类又继承了PageHelper类,调用自定义的TableSupport类的静态方法buildPageRequest()进行构建分页请求,将获取到的当前页和每页条数进行封装到java提供的分页类PageHelper类中,而PageHelper类实际上是分页时所需要调用的函数
- 在TableSupport类中,buildPageRequest()方法调用了getPageDomain()方法,通过ServletUtils类的getParameterToInt()方法获取当前页和每页条数封装到分页对象pageDomain中进行返回
- ServletUtils类中的getParameterToInt()方法通过http的request请求获取指定参数进行返回
- PageHelper类又继承了PageMethod类,PageHelper.startPage()方法调用了PageMethod类的startPage()方法,将pageNum和pageSize添加到了Page类中
getDataTable()方法
-
将返回的数据进行封装
-
SysDictTypeController类的getDataTable()方法实际调用了父类的getDataTable()方法,将list数据进行整合,setTotal()方法时,通过构造PageInfo对象将list表数据进行处理返回表数据的总条数
- PageInfo对象继承了PageSerializable类,在构造时调用了super()方法,进入父类PageSerializable进行构造,类PageSerializable将List进行强转Page,说明Page为List的子类,获取该list的总条数进行赋值
- 子类PageInfo调用getTotal()方法时,实际上调用了父类的getTotal()方法获取总数
分页实现
-
selectDictTypeList() 方法最终会到xml文件中,从数据库中获取数据进行返回,而xml文件中实际上并没有对分页进行处理
-
前端访问时,查看后端日志,sql语句被mybatis进行拦截并处理后执行,其中,limit 指向的是从第10条数据开始的10条数据
- 在执行分页查询时,MyBatis多请求了sql语句: select count(0) from sys_dict_type 将返回得到的总条数赋值到了指定Page对象的total属性上.在获取total时将list进行强转为Page获取total属性,赋值给了PageSerializable的total属性,通过子类PageInfo调用父类getTotal()获取total的值
- 表数据的获取则是MyBatis获取之前startPage()时处理的PageHepler类中的属性,进行处理后对sql语句进行修改和参数赋值,从而获取指定表数据
强转示例
-
定义类MyPage
-
定义方法selectMyPageList,返回List
-
调用selectMyPageList
-
配置设置,启动项目访问接口查看