mybatisplus解决分页最多500条数据
问题:当设置分页参数size超过500时,记录最多500条
原因:MyBatis-Plus低版本的PaginationInterceptor,定义了默认limit为500。当size超出limit时设置size为limit的值
以下是部分源码
@Setter
@Deprecated
@Accessors(chain = true)
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class PaginationInterceptor extends AbstractSqlParserHandler implements Interceptor {
/**
* 单页限制 500 条,小于 0 如 -1 不受限制
*/
protected long limit = 500L;
@Override
public Object intercept(Invocation invocation) throws Throwable {
if (this.limit > 0 && this.limit <= page.getSize()) {
//处理单页条数限制
handlerLimit(page);
}
}
/**
* 处理超出分页条数限制,默认归为限制数
*
* @param page IPage
*/
protected void handlerLimit(IPage<?> page) {
page.setSize(this.limit);
}
}
解决方案
1.如果不能切换到mybatis-plus高级版本,使用以下解决方案
1.1 配置分页插件时重新设置limit的值
代码如下
// 旧版
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setLimit(5000);
return paginationInterceptor;
}
1.2 或者在分页查询时,对分页条件进行处理
代码如下
public IPage<User> page(Page page, User param){
QueryWrapper<User > queryWrapper = new QueryWrapper<>();
queryWrapper.select().orderByDesc("create_time");
handlePage(queryWrapper,page);
IPage<User> pageData = page(page, queryWrapper);
}
// 旧版
public void handlePage(QueryWrapper<T> queryWrapper, Page page) {
long pageSize = page.getSize();
if (pageSize > 500) {
String str = "limit %s offset %s ";
String lastLimit = String.format(str, pageSize, (page.getCurrent() - 1) * pageSize);
queryWrapper.last(lastLimit);
page.setSize(-1);
}
}
2. 切换到mybatis-plus高级版本,配置新版分页插件
@Configuration
public class MybatisPlusConfig {
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
return interceptor;
}
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免 缓存出现问题(该属性会在旧插件移除后一同移除)
*/
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return configuration -> configuration.setUseDeprecatedExecutor(false);
}
}