SQL分析と出力
MyBatis-PlusはSQL分析と出力機能を提供しており、p6spy
コンポーネントを統合することで、SQL文とその実行時間を簡単に出力できます。この機能はMyBatis-Plus 3.1.0以降のバージョンで利用可能です。
p6spyの概要
p6spy
は、データベースアクセスをインターセプトして記録するツールで、JDBCドライバをプロキシすることで動作します。これは、アプリケーションが通常通りJDBCを使用している間に、p6spy
がすべてのSQL文とその実行時間を記録することを意味します。これは開発やデバッグプロセスにおけるSQL最適化に非常に有用です。
p6spy
はSQLログの記録に限定されず、以下のような高度な機能も提供します:
- 遅いSQLの検出:
outagedetection
とoutagedetectioninterval
を設定することで、p6spy
は設定された閾値を超える実行時間のSQL文を記録できます。 - カスタムログフォーマット:
logMessageFormat
を使用して、タイムスタンプ、実行時間、SQL文などを含むSQLログの出力フォーマットをカスタマイズできます。 - ログ出力の制御:
appender
設定項目により、ログをコンソール、ファイル、またはログシステムに出力するかを選択できます。
p6spy
は強力なツールであり、MyBatis-Plusユーザーに便利なSQL分析と出力機能を提供します。適切に設定することで、開発およびテスト段階で効果的にSQL文を監視および最適化できます。ただし、パフォーマンスのオーバーヘッドがあるため、本番環境での使用は注意が必要です。
サンプルプロジェクト
この機能の使用方法をよりよく理解するために、公式が提供するサンプルプロジェクトを参照できます:
依存関係の導入
まず、プロジェクトにp6spy
の依存関係を導入する必要があります。以下はMavenとGradleの2つのビルドツールでの導入方法です:
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.9.1</version></dependency>
implementation 'p6spy:p6spy:3.9.1'
設定
次に、application.yml
またはapplication.properties
で対応する設定を行う必要があります。
application.yml
spring: datasource: driver-class-name: com.p6spy.engine.spy.P6SpyDriver url: jdbc:p6spy:h2:mem:test # その他のデータベース設定...
spy.properties
p6spy
の設定ファイルspy.properties
には複数の設定項目が含まれており、以下は主要な設定の例です:
# モジュールリスト、バージョンに応じて適切な設定を選択modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
# カスタムログフォーマットlogMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
# ログをコンソールに出力appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# JDBCドライバの登録解除deregisterdrivers=true
# プレフィックスを使用useprefix=true
# 除外するログカテゴリexcludecategories=info,debug,result,commit,resultset
# 日付フォーマットdateformat=yyyy-MM-dd HH:mm:ss
# 実際のドライバリスト# driverlist=org.h2.Driver
# 遅いSQLの記録を有効化outagedetection=true
# 遅いSQLの記録基準(単位:秒)outagedetectioninterval=2
# flw_ で始まるテーブルのSQL出力をフィルタリングfilter=trueexclude=flw_*
Spring Boot統合
Spring Bootプロジェクトでは、p6spy-spring-boot-starter
を使用して統合プロセスを簡素化できます。
依存関係
<dependency> <groupId>com.github.gavlyukovskiy</groupId> <artifactId>p6spy-spring-boot-starter</artifactId> <version>1.12.0</version></dependency>
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.12.0'
設定
decorator: datasource: p6spy: # ログフォーマット log-format: "\ntime:%(executionTime) || sql:%(sql)\n" # カスタムログクラス logging: custom custom-appender-class: com.example.testinit.config.StdoutLogger
public class StdoutLogger extends com.p6spy.engine.spy.appender.StdoutLogger { public void logText(String text) { System.err.println(text); }}
p6spy-spring-boot-starter
の設定に関する詳細情報は、GitHubを参照してください。
注意事項
driver-class-name
はp6spy
が提供するドライバクラスに設定する必要があります。url
のプレフィックスはjdbc:p6spy
とし、その後に実際のデータベース接続アドレスを続ける必要があります。- 出力されるSQLが
null
の場合、excludecategories
にcommit
を追加してください。 - バッチ操作でSQLが出力されない場合、
excludecategories
からbatch
を削除してください。 - バッチ操作での重複出力の問題については、
MybatisPlusLogFactory
を使用してください(3.2.1で新規追加)。 - このプラグインはパフォーマンスのオーバーヘッドをもたらす可能性があるため、本番環境での使用は推奨されません。
以上の手順により、開発プロセスでSQL文を簡単に分析および出力できるようになります。最適な使用効果を得るために、実際のニーズに応じて設定を調整してください。