PageHelper自定义分页实现

Oracle 12C以上版本支持的分页语句写法:

SELECT * FROM T_USER ORDER BY CREATE_TIME OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;

由于mybatisplus分页插件中的支持Oracle 12C以上版本的分页,但是目前PageHelper不支持Oracle 12C以上版本的分页语句写法,因此我们需要自定义一个Oracle12cDialect类来实现生成新的分页语句。

代码如下:

package com.example.pagehelper;

import com.github.pagehelper.Page;
import com.github.pagehelper.dialect.AbstractHelperDialect;
import org.apache.ibatis.cache.CacheKey;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.springframework.context.annotation.ComponentScan;

import java.util.Map;

public class Oracle12Dialect extends AbstractHelperDialect {

    @Override
    public Object processPageParameter(MappedStatement ms, Map<String, Object> paramMap, Page page, BoundSql boundSql, CacheKey pageKey) {
        paramMap.put("First_PageHelper", page.getStartRow());// 给第一个(占位符)?设置值
        paramMap.put("Second_PageHelper", page.getEndRow()); // 给第二个(占位符)?设置值
        pageKey.update(page.getStartRow());
        pageKey.update(page.getEndRow());
        this.handleParameter(boundSql, ms, Long.TYPE, Long.TYPE);
        return paramMap;
    }

    @Override
    public String getPageSql(String sql, Page page, CacheKey pageKey) {
        StringBuilder sqlBuilder = new StringBuilder(sql.length() + 39);
        sqlBuilder.append(sql);
        sqlBuilder.append("\n OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ");// 原sql语句后面追加分页语句
        return sqlBuilder.toString();
    }
}

然后在application.yml文件中添加如下配置:

pagehelper:
  helper-dialect: com.example.pagehelper.Oracle12Dialect

如果是引入的pagehelper-spring-boot-starter的依赖,不需要做其他配置就可以生效了;

如果仅仅是引入的pagehelper的依赖,还需要在mybatis的配置文件中加入拦截器PageInterceptor。

 

posted @ 2020-09-25 15:02  今夕是何年?  阅读(1556)  评论(0编辑  收藏  举报