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。
探索不以困难而止,学习不以艰苦而终