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行にマージし、セグメント化に指定された文字を使用してグループ化およびマージを実現します