在做项目中遇到一个问题。分页功能如果想人工设置一页展示数量应该设置什么参数。
需求和场景是一页数据很多,但是就是要一页把所有数据都展示出来。WTF?
还有导出和列表想用同一个request对象也会遇到这个问题。
开始的时候,是设置 maxLimit 这个参数,然后 searchCount设置成false(不查询count条数),但是只设置这个参数,对于要一页展示所有数据这个场景不管用,不管maxLimit 设置多大,还是只查询10条。为啥???
只能去看mybatis源码了--------
在项目自己实现的分页组件中发现了这么一个地方,原来是它这里设置成默认一页10条记录
而 BasePage继承了 mybatisplus的 IPage ,然后会在后续处理。
在打印sql的时候发现 ,对于分页请求mybatisplus 会默认给sql 语句加上 limit,即使什么参数不传用这个分页也会加上。这个玩意是什么时候加上的呢??
而我们知道 mysql和postgresql的分页就是用limit实现的。而mybatisplus分页是通过拦截器对sql语句进行预处理,把limit 和参数拼在原始sql后面,然后再将处理过sql语句交给mybatis。
通过一番寻找,具体的调用链是这样的,(懒得画时序图了):
com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor#intercept
->com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor#beforeQuery
->com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor#beforeQuery
//设置size ,并且把这个参数设置成 mybatis_plus_first 放到缓存中,后续设值的时候用
->com.baomidou.mybatisplus.extension.plugins.pagination.dialects.PostgreDialect#buildPaginationSql
首先分页方法通过mybatis plugin 代理找到分页的拦截器
在 这个方法中 ,处理maxLimit。如果 size 大于 maxLimit,maxLimit才生效。否则还是以size作为一页展示条数限制
最后是在这个类中将limit拼在sql语句上的
使用这个分页拦截器,需要在springboot启动时注入进容器
而分页组件就是这个设置为size的
最后结论:如果想要一页显示很多条数据,就设置IPage的size 参数。