irpas技术客

使用mybatis-plus 分页插件 PostgreSQL_wangxudongx_mybatis-plus postgresql

未知 7594

使用mybatis-plus 分页插件 PostgreSQL 前言环境一、使用步骤1.引入库2.mybatis-plus配置类使用分页分页类构造函数使用页索引使用元素偏移量 mybatis-plus分页实现内部Postgre 数据库分页语句组装实现 文章导读


前言

mybatis-plus的查询默认提供了分页类和方法,但是需要引入三方依赖和载入配置类来启用。 老版mybatis-plus只要引入pagehelper依赖即可,但是新版springboot和mybatis-plus需要再引入jsqlparser来解决依赖冲突会产生的两个问题:

1: 使用分页查询时报错 java.lang.NoSuchMethodError: net.sf.jsqlparser… 2:分页和查total失效


环境 组件版本JDK11springboot2.5.2mybatis-plus-boot-starter3.4.2

以下是本篇文章正文内容

一、使用步骤 1.引入库

代码如下(示例):

<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot</artifactId> <version>1.4.2</version> <type>pom</type> </dependency> <dependency> <groupId>com.github.jsqlparser</groupId> <artifactId>jsqlparser</artifactId> <version>3.1</version> <!-- <type>bundle</type>--> </dependency> 2.mybatis-plus配置类

代码如下(示例):

@Configuration @ConditionalOnClass(value = {PaginationInterceptor.class}) public class MybatisPagePluginConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); paginationInnerInterceptor.setOptimizeJoin(true); paginationInnerInterceptor.setDbType(DbType.POSTGRE_SQL); paginationInnerInterceptor.setOverflow(true); interceptor.addInnerInterceptor(paginationInnerInterceptor); OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor = new OptimisticLockerInnerInterceptor(); interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor); return interceptor; } } 使用分页

在分页查询接口的时候方面有两类: 一是使用页索引来翻页; 二是使用记录偏移量来翻页; 下面对两种使用方式各做了示例。

分页类构造函数 /** * 分页构造函数 * * @param current 当前页 * @param size 每页显示条数 * @param isSearchCount 是否查询记录总数 */ public Page(long current, long size, boolean isSearchCount); 使用页索引 IPage<SconlinePredictionOrders> page = new Page<>( queryParams.getOffset() , queryParams.getLimit(), true); 使用元素偏移量 IPage<SconlinePredictionOrders> page = new Page<>( queryParams.getOffset() / queryParams.getLimit() + 1 , queryParams.getLimit(), true);
mybatis-plus分页实现内部

分页实现是使用分页拦截器PaginationInnerInterceptor,拦截IPage参数,然后组装limit sql来实现的,因为各个数据库limit语法不同,所以sql组装类也是针对各个数据库有多个。

/** * 分页拦截器 * <p> * 默认对 left join 进行优化,虽然能优化count,但是加上分页的话如果1对多本身结果条数就是不正确的 * * @author hubin * @since 3.4.0 */ @Data @NoArgsConstructor @SuppressWarnings({"rawtypes"}) public class PaginationInnerInterceptor Postgre 数据库分页语句组装实现 /** * Postgre 数据库分页语句组装实现 * * @author hubin * @since 2016-01-23 */ public class PostgreDialect implements IDialect { @Override public DialectModel buildPaginationSql(String originalSql, long offset, long limit) { StringBuilder sql = new StringBuilder(originalSql).append(" LIMIT ").append(FIRST_MARK); if (offset != 0L) { sql.append(" OFFSET ").append(SECOND_MARK); return new DialectModel(sql.toString(), limit, offset).setConsumerChain(); } else { return new DialectModel(sql.toString(), limit).setConsumer(true); } } }

可以看出PostgreSql的limit组装是通过页索引算出偏移量然后组装的SQL。


文章导读

Spring动态数据源:Mybatis-plus、C3P0 mysql pgsql 多行记录转JSON数组字段 行转json列 mysql pgsql 实现多行记录合并成一行 分组合并 用指定字符做分割


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #MybatisPlus #postgresql #分页失效使用分页报错