pagerHelper与mybatisPlus分页冲突问题分析

pagerHelper与mybatisPlus分页冲突问题分析

问题现象

在开发owner服务的时候发现,mybatisPlus分页不起作用,返回总数永远是0.

//mybatisPlus分页接口
public interface IService<T> {
    //返回的page信息不包含total等信息,只显示一页内容
	Page<T> selectPage(Page<T> page);
}
  • jar包版本
    • mybatis-plus 2.0.5
    • pagehelper-spring-boot-starter 1.2.5
      • pagehelper 5.1.4

问题分析

由于不管是pageHelper还是mybatis-plus分页的实现逻辑都是基于mybatis的拦截器来实现的,即Interceptor。因此初步推断是这里产生了冲突。

mybatis-plus实现逻辑

通过查看源码可以发现实现分页逻辑的拦截器是PaginationInterceptor

@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class, Integer.class }) })
public class PaginationInterceptor implements Interceptor {
    public Object intercept(Invocation invocation) throws Throwable {
		Object target = invocation.getTarget();
		if (target instanceof StatementHandler) {
			StatementHandler statementHandler = (StatementHandler) PluginUtils.realTarget(invocation.getTarget());
			MetaObject metaStatementHandler = SystemMetaObject.forObject(statementHandler);
			RowBounds rowBounds = (RowBounds) metaStatementHandler.getValue("delegate.rowBounds");

			//这里通过rowBounds的类型来判断是否分页
			if (rowBounds == null || rowBounds == RowBounds.DEFAULT) {
				return invocation.proceed();
			}
			BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql");
			String originalSql = (String) boundSql.getSql();

			if (rowBounds instanceof Pagination) {
				MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement");
				Pagination page = (Pagination) rowBounds;
				boolean orderBy = true;
				if (page.isSearchCount()) {
					CountOptimize countOptimize = SqlUtils.getCountOptimize(originalSql, optimizeType, dialectType,
							page.isOptimizeCount());
					orderBy = countOptimize.isOrderBy();
					this.count(countOptimize.getCountSQL(), mappedStatement, boundSql, page);
					if (page.getTotal() <= 0) {
						return invocation.proceed();
					}
				}
				String buildSql = SqlUtils.concatOrderBy(originalSql, page, orderBy);
				originalSql = DialectFactory.buildPaginationSql(page, buildSql, dialectType, dialectClazz);
			} else {
				originalSql =
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值