mybatis-plus ページング プラグイン PostgreSQL の使用


序文

mybatis-plus のクエリはデフォルトでページング クラスとメソッドを提供しますが、サードパーティの依存関係を導入し、それらを有効にするために構成クラスをロードする必要があります。
mybatis-plus の古いバージョンでは pagehelper 依存関係を導入するだけで済みますが、springboot と mybatis-plus の新しいバージョンでは、依存関係の競合によって引き起こされる 2 つの問題を解決するために jsqlparser を導入する必要があります。

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


環境

コンポーネント バージョン
JDK 11
スプリングブーツ 2.5.2
mybatis-plus-ブートスターター 3.4.2

以下是本篇文章正文内容

1. 利用手順

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;
    }
}

ページネーションを使用する

ページング クエリ インターフェイスには 2 種類あり、
1 つはページ インデックスを使用してページをめくる方法、
もう 1 つはレコード オフセットを使用してページをめくる方法で、
それぞれの使用方法の例を以下に示します。

ページネーションクラスのコンストラクター

    /**
     * 分页构造函数
     *
     * @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 パラメーターをインターセプトし、制限 SQL を組み立てることによって実装されます。各データベースの制限構文は異なるため、データベースごとに複数の 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 の制限アセンブリは、ページ インデックスを通じてオフセットを計算し、それをアセンブルする SQL であることがわかります。


記事紹介

Spring動的データソース:Mybatis-plus、C3P0
mysql pgsql 複数行のレコードをJSON配列フィールドの行からjson列に変換
mysql pgsqlは、複数行のレコードを1行にマージし、セグメント化に指定された文字を使用してグループ化およびマージを実現します

おすすめ

転載: blog.csdn.net/wangxudongx/article/details/124541990