mybatis の基本的な設定、基本的な特性をまとめ、最後に sqlsession の原理を簡単に分析し、実行プロセスを理解します。
簡単な設定の紹介#
簡単に言えば、Mybatis の設定は以下の手順で行われます:
- POJO(JavaBean)を作成し、データベースのクエリ結果を JavaBean にマッピングすることが最終目標です。
- POJO に対応する Mapper インターフェースを設定します。この中にはさまざまなメソッドがあり、それぞれ mapper.xml のクエリ文に対応します。
- POJO に対応する XML マッピングを設定します。キャッシュ、SQL クエリなどを記述します。
- mybatis-config.xml という主要な Mybatis 設定ファイルを設定します。データソースの設定、mapper.xml のスキャンなどを行います。
注意:上記の設定には厳密な順序はありません。
以下は比較的明確な設定フローチャートの例です
mapper インターフェースの実装クラスは mybatis-config.xml->SqlSessionFactoryBuilder->SqlSessionFacotry->SqlSession->mapper を通じて取得されます。
ライフサイクル#
- SqlSessionFactoryBuilder:ビルダーを作成し、
SqlSessionFactory
が作成されると役割は完了し、回収できます。 - SqlSessionFactory:
SqlSession
を作成する役割を果たします。SqlSession
は JDBC のConnection
オブジェクトに相当し、アプリケーションがデータベースにアクセスする必要があるたびにSqlSessionFactory
を使用してSqlSession
を作成します。したがって、SqlSessionFactory
は Mybatis のライフサイクル全体で存在します(各データベースには 1 つのSqlSessionFactory
が対応し、シングルトンで生成されます)。 - SqlSession:トランザクションの処理中に存在するライフサイクルであり、スレッドセーフではないオブジェクトです(マルチスレッドの場合は特に注意が必要です)。つまり、アプリケーションのリクエストと要求の間に存在し、複数の SQL を実行してトランザクションの一貫性を保証します。
- Mapper:インターフェースであり、実装クラスはありません。その役割は SQL を送信し、必要な結果を返すか、SQL を使用してデータベーステーブルを変更することです。したがって、
SqlSession
内に存在し、メソッドレベルのものです。SqlSession
が破棄されると、Mapper も破棄されます。
基本的な特性#
遅延ロード#
つまり、システムはクエリの実行を遅延させ、通常はネストされたクエリの場合に使用されます。ネストされたクエリ内の SQL クエリは遅延ロードされ、実際にそのクエリを使用する必要がある場合にのみロードされます。まるで怠け者が言ったことを言って、彼が動いたときだけ、絶対に半歩多く実行されないので、この機能は遅延ロードとも呼ばれます。
遅延ロードはconfig.xml
で設定する必要があり、association
またはcollection
を使用してのみ実現できます。つまり、遅延ロードを使用するにはマッピング関係が存在するビジネスシナリオでのみ必要です。
設定ステートメント
<settings>
<setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/>
</settings>
使用する際には、遅延ロードは resultMap を使用する必要があり、resultType には遅延ロード機能はありません。
ファーストレベルキャッシュ#
- システムはデフォルトで有効であり、キャッシュの範囲は 1 つの
SqlSession
です。 - 同じ
SqlSession
内の同じクエリのみがキャッシュされ、異なるSqlSession
内の同じクエリはキャッシュされません。
セカンドレベルキャッシュ#
SqlSession
の相互の隔離を解決するためのキャッシュの範囲は 1 つのMapper
インターフェースです。- セカンドレベルキャッシュはデフォルトで無効になっており、設定する必要があります。Mybatis は、返される POJO がシリアライズ可能である必要があると要求しています。
キャッシュの設定は単に<cache/>
を XML に記述するだけで、またはアルゴリズム、リフレッシュ間隔、キャッシュの状態、サイズなどを指定することもできます。
例:
- マッピングステートメントファイル内のすべての select ステートメントがキャッシュされます。
- マッピングステートメントファイル内のすべての insert、update、delete ステートメントがキャッシュがクリアされます。
- キャッシュはデフォルトの LRU(最近最も使用されない)アルゴリズムを使用して回収されます。
- タイムスケジュールに基づいてキャッシュはいつでも順番にリフレッシュされます。
- キャッシュはリストコレクションまたはオブジェクトの 1024 の参照を保存します。
- キャッシュは read/write 可能なキャッシュと見なされ、共有されないため安全に変更できます。
カスタムキャッシュ#
Mybatis のインターフェースを使用して、Redis などを使用してカスタムキャッシュを実装します。
実践設定#
補完予定
SqlSession の原理#
SqlSession
は select/insert/update/delete メソッドを提供します。
マッパー(Mapper
)は実際にはダイナミックプロキシオブジェクトであり、MapperMethod
のexecute
メソッドに入ると、簡単にSqlSession
の削除、更新、クエリ、選択メソッドを見つけることができます。
内部実装の観点から言えば、ダイナミックプロキシ技術を使用してインターフェースを実行し、コマンドパターンを使用し、最終的にはSqlSession
のインターフェースメソッド(getMapper()
メソッドなど)を使用して SQL クエリを実行します(つまり、Mapper インターフェースメソッドの実装は、内部的にはSqlSession
インターフェースメソッドの実装を使用しています)。
SqlSession の重要な 4 つのオブジェクト
- Execute:
StatementHandler
、ParmmeterHandler
、ResultHandler
をディスパッチして対応する SQL 文を実行します。 - StatementHandler:データベースの
Statement(PrepareStatement)
を使用して操作を実行します。つまり、内部的にはprepareStatement
がカプセル化されています。 - ParammeterHandler:SQL パラメータを処理します。
- ResultHandler:結果セット ResultSet を組み立てて返します。
SqlSession の 4 つの主要なオブジェクト#
Execute#
Java とデータベースの間のインタラクションを担当し、SQL の実行プロセス全体に参加します。カテゴリ
- SIMPLE シンプルな実行プログラム(デフォルト)
- REUSE 再利用可能なプリペアドステートメント実行プログラム
- BATCH バッチ更新、バッチ専用ハンドラ
ソースコード
package org.apache.ibatis.session;
public enum ExecutorType { SIMPLE, REUSE, BATCH}
役割
他のオブジェクトをディスパッチしてプリコンパイル、パラメータ設定、および結果セットの返却を完了します。
StatementHanlde#
カテゴリ(それぞれ異なる実行プログラムに対応)
- SimpleStatementHandler
- PrepareStatementHandler
- CallableStatementHandler
役割
データベースセッションを専門に処理します。プリコンパイルを行い、ParameterHandler を呼び出してパラメータを設定します。基本的にはデータベースの接続をカプセル化しています。
作業フロー
- RoutingStatementHandlerオブジェクトを使用して StatementHandler を生成します。
- RoutingStatementHandler は対応する statementHandler オブジェクトを検索します。
- statementHandler はデータベースのメソッドを呼び出します。
ParameterHandler#
役割
プリコンパイルされたパラメータを設定します。
作業フロー
- parameterObject からパラメータを取得し、typeHandler(Configuration に登録されている)を使用してパラメータを処理します。
ResultSetHandler#
役割
結果セットを組み立てて返します。
実行プロセスのまとめ#
- prepare プリコンパイル
- parameterize パラメータ設定
- doUpdate/doQuery SQL の実行
神のまとめ
参考リンク