使用分页插件的后悔药(二)


title: 使用分页插件的后悔药(二) tags:

  • PageHelper
  • Mybatis 通用 Mapper
  • orderByOnly
  • 分页
  • mybatis categories: mybatis date: 2018-01-03 16:46:13

背景

我们使用了pageHelper之后大部分的需求可以满足了 部分场景下不需要使用count等语句来做分页,只需要做sql查询

上一篇我们对于分页插件的问题进行了一些描述以及解决1

使用分页插件的后悔药

问题

小伙伴在使用了一段时间之后提出了新的需求。现在使用了分页插件之后已经不写orderby语句了

但是在某些场景下现在不需要使用分页 但是仍然需要使用orderby

我们在使用分页插件的后悔药中 提到使用enableCount的参数来解决

但是这样分页插件的逻辑将不会执行了 也就不会执行orderby

有没有办法也使用到orderby呢???

解决

抛出一个问题 当然是要解决的 我们来看一下具体执行分页的逻辑是啥

    @Override
    public boolean skip(MappedStatement ms, Object parameterObject, RowBounds rowBounds) {
        Page page = sqlUtil.getPage(parameterObject, rowBounds);
        if (page == null) {
            return true;
        }
        return (page.getPageSizeZero() != null && page.getPageSizeZero()) && page.getPageSize() == 0;
    }
复制代码

上篇已经分析过可以设置pageSize 那我们需要分页插件的逻辑只是不希望执行count有没有办法呢?

    @Override
    public boolean beforeCount(MappedStatement ms, Object parameterObject, RowBounds rowBounds) {
        Page page = SqlUtil.getLocalPage();
        return !page.isOrderByOnly() && page.isCount();
    }
复制代码

很明显还有一个参数名为orderByOnly

顾名思义应该是制作排序【那自然不需要count了】

我们再看一下在做查询的时候是否也不会吧页数设置进去

    @Override
    public String getPageSql(MappedStatement ms, BoundSql boundSql, Object parameterObject, RowBounds rowBounds, CacheKey pageKey) {
        String sql = boundSql.getSql();
        Page page = SqlUtil.getLocalPage();
        //支持 order by
        String orderBy = page.getOrderBy();
        if (StringUtil.isNotEmpty(orderBy)) {
            pageKey.update(orderBy);
            sql = OrderByParser.converToOrderBySql(sql, orderBy);
        }
        if (page.isOrderByOnly()) {
            return sql;
        }
        return getPageSql(sql, page, rowBounds, pageKey);
    }
复制代码

很明显当isOrderByOnly设置时此时分页也不会执行。

因此我们改造SoInterceptor如下

    @Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))
    public class SoInterceptor implements Interceptor {
        private static final Joiner SORT_JOINER = Joiner.on(Constants.COMMA);
     
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            Object paramter = invocation.getArgs()[1];
            if (paramter instanceof So) {
                So so = (So) paramter;
                Page<Object> page = PageHelper.startPage(so.getCurrentPage(), so.getPageSize(), so.isEnableCount());
                page.setOrderByOnly(so.isOrderByOnly());
                if (so.getSorts() != null && !so.getSorts().isEmpty()) {
                    page.setOrderBy(SORT_JOINER.join(so.getSorts()));
                }
                try {
                    return invocation.proceed();
                } finally {
                    PageHelper.clearPage();
                }
            }
            return invocation.proceed();
        }
     
        @Override
        public Object plugin(Object target) {
            if (target instanceof Executor) {
                return Plugin.wrap(target, this);
            } else {
                return target;
            }
        }
     
        @Override
        public void setProperties(Properties properties) {
            // Do nothing
        }
    }
复制代码

这样就可以既不分页也带排序了【条件带上orderByOnly=true】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中使用分页插件,你可以使用MyBatis-PageHelper插件来实现分页功能。以下是使用步骤: 1. 添加依赖:在你的Spring Boot项目的pom.xml文件中,添加如下依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.13</version> </dependency> ``` 2. 配置PageHelper:在application.yml(或application.properties)文件中添加如下配置: ```yaml pagehelper: helperDialect: mysql reasonable: true ``` 3. 使用PageHelper进行分页查询:在你的Mapper接口中定义方法,使用PageHelper提供的静态方法进行分页查询。 ```java import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; // ... public interface YourMapper { List<YourEntity> queryEntities(); default PageInfo<YourEntity> queryEntitiesWithPage(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List<YourEntity> entities = queryEntities(); return new PageInfo<>(entities); } } ``` 4. 调用分页查询方法:在你的Service层或Controller层中,调用分页查询方法即可获取分页数据。 ```java import com.github.pagehelper.PageInfo; // ... @Service public class YourService { @Autowired private YourMapper yourMapper; public PageInfo<YourEntity> queryEntitiesWithPage(int pageNum, int pageSize) { return yourMapper.queryEntitiesWithPage(pageNum, pageSize); } } ``` 这样就可以在Spring Boot项目中使用分页插件进行分页查询了。注意,以上示例以MyBatis为例,如果你使用其他持久层框架,需要稍作修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值