1つは、最初にいくつかの主要なインターフェイスとクラスを理解することです
(1)Mybatisの4つのコアコンポーネント
- エグゼキュータ:キャッシュの作成、StatementHanderの呼び出しの管理、StatementHandlerの構成環境の提供に使用されます。
- StatementHander:主に、データベースと対話するステートメントオブジェクトを作成するために使用されます。
- ParamenterHandler:これは主にPreparedStatementオブジェクトのプリコンパイルされたSQLのパラメーター構成で使用されます
- ResultSetHandler:主にクエリ結果とエンティティクラスをバインドするために使用されます
1.エグゼキュータインターフェイス(エグゼキュータはSQLステートメントの実行に使用されます)
主に4つの実装クラスがあります。
- SimpleExecutor: Simple executor、すべてのデータベース操作は処理のためにStatementHandlerに委任されます
- ReuseExecutor: JDBCステートメントがSQLに従ってキャッシュされることを除いて、SimpleExecutorと同様のエグゼキューターを再利用します。同じSQLが検出されると、ステートメントの作成が省略されます。キャッシュをクリアするには、flushStatementを手動で実行する必要があります。
- BatchExecutor:バッチエグゼキュータ。JDBCのbatchUpdateメソッドを使用して、SQLをすぐに実行するためにSqlSessionのflushStatementsを手動で実行する必要があります。
- CachingExecutor:キャッシングエグゼキュータ
2. StatementHandlerインターフェース( JDBCでStatementインターフェースを処理するために使用)
- SimpleStatementHandler:単純なSQL処理に使用されるJDBCのStatementインターフェースに対応します。
- PreparedStatementHandler: JDBCのPreparedStatementプリコンパイル済みSQLのインターフェースに対応します。
- CallableStatementHandler: JDBCのCallableStatementインターフェースに対応し、ストアード・プロシージャーに関連するインターフェースを実行するために使用されます。
- RoutingStatemengtHandler:上記の3つのインターフェースのルーティングは、作成と呼び出しのみを担当します。
3. ParameterHandlerインターフェース( PreparedStatementのSQLステートメントパラメーターに値を動的に割り当てるパラメータープロセッサー)
パラメータの説明:
- getParameterObject:パラメーターの読み取りに使用
- setParameters:PreparedStatementのパラメーターに値を割り当てるために使用されます
4. ResultSetHandlerインターフェイス(結果セットを処理し、マッパーファイルのResultTypeおよびResultMapに従って対応するオブジェクトをカプセル化し、それを返すために使用されます。)
DefaultResultSetHandlerのみが実装クラスです
- handleResultSets:ステートメントの実行後に生成された結果セット(複数の結果セット)を結果リストにマップします
- handleCursorResultSets:カーソル結果セットを処理します
- handleOutputParameters:ストアドプロシージャの実行後に出力パラメータを処理します
(2)その他の主要なインターフェースとクラス
1.構成クラス:これはmybatis全体のコア構成クラスであり、すべてのxmlおよびその他の情報は最終的に構成クラスに解析されます。
2. MappedStatementクラス:マッパータグ情報をマッパーファイルに格納するために使用されます。
3. ResultMapクラス:マッパーファイルにresultMapタグ情報を格納するために使用されます
4. ResultMappingクラス:結果情報をマッパーファイルのresultMapタグに格納します。これは、javaおよびmysqlの列マッピングクラスとして使用されます。
5. BoundSqlクラス:動的SQLを処理するために使用され、SQL文字列を返します
6、ResultSetWrapperクラス: ResultSet結果セットをラップするために使用されます
7. ResultHandlerインターフェース:結果を返すカスタム処理に使用され、sqlSessionTemplateのselectメソッドを使用して実装され、ストリーミングクエリに使用され、ビッグデータがoomを引き起こすのを防ぎます。
8. ResultContextインターフェース:唯一の実装クラスはDefaultResultContextです。これは、ResultHandlerインターフェースのパラメーターです。各ResultContextは、getResultObjectを介して取得できるデータの一部を表します。
9. TypeHandlerインターフェース:タイププロセッサー。javaTypeとJdbcTypeの間の変換を処理するために使用され、PreparedStatementでパラメーター値を設定し、ResultSetまたはCallableStatementから値を取得するためにも使用されます。
10. RowBoundsクラス: mybatis論理ページングに使用されます。原則は、すべてのデータを取り出し、前のオフセットデータを破棄し、残りのデータの制限バーを取得することです。パフォーマンスが良くありません。PageHelperページングプラグインを使用することをお勧めします。最下層は、インターセプターを介して制限ステートメントを追加することです。
第二に、SqlSession実行のプロセス
Mapperを使用してsqlまたはsqlSessionTemplateを実行するかどうかに関係なく、最終的にはDefaultSqlSession(リストクエリ)のselectListメソッドを実行します。
https://blog.csdn.net/sumengnan/article/details/113953507を参照してください。ここでは、selectListメソッドから直接開始します。
1.DefaultSqlSessionのselectListメソッド
構成からMappedStatement情報を取得します(プロジェクトの開始時に、mapper.xmlファイルのすべてのコンテンツが構成に解析されているため取得できます)
エグゼキュータのタイプは、プロジェクトの開始時の構成に従って生成されます。デフォルトはSimpleです。キャッシュが有効になっている場合は、cachingExecutorです。
2.クエリメソッドは、クエリ用のSimpleExecutorの抽象クラスBaseExecutorメソッドです。
キャッシュに存在する場合は、handleLocallyCachedOutputParametersを使用します。存在しない場合は、queryFromDatabaseを使用してデータベースからデータをクエリします。
3.BaseExecutorのqueryFromDatabaseメソッドがクエリに使用されます
主に一部のデータをキャッシュし、doQueryメソッドを呼び出すために使用されます
4.このdoQueryメソッドは、サブクラスが実装するための実際のメソッドです。
4.1ビルドstatementHandler
RoutingStatementHandlerが静的プロキシクラスとして使用されていることがわかります。
次に、インターセプト後のカスタム処理用のプラグインインターセプターを追加します。例:PageHeplerページングプラグイン
4.2、Statementオブジェクトの準備を開始します
トランザクションから接続データベース接続を取得します(これはJDBCの最初のステップではありませんか?最初にデータベース接続を取得します)
ステートメントを初期化します。接続からStatementオブジェクトを作成します(これはJDBCの2番目のステップではありませんか?Statementオブジェクトを作成します)
ExecutorがPreparedExecutorの場合、prepareStatementオブジェクトが取得され、handler.parameterize(stmt)メソッドが実行されます。
パラメータを設定するには、String型の場合、StringTypeHandlerクラスが実行されます。ps.setString(i、parameter);を使用して、パラメータ値を設定します(これは、JDBCの3番目のステップではありませんか?コンパイル済みSQLパラメータ割り当て)
5.手順4のdoQueryメソッドに戻り、handler.queryメソッドの実行を続行します。
statement.execute(sql);を実行して、SQLクエリを実行します。(これはJDBCの4番目のステップではありませんか?executeメソッドを実行してSQLクエリを実行します)
6、handleResultSetsメソッドを入力し続けます
複数の結果セットが存在する場合がありますResultSet
6.1。getFirstResultSetと入力して、結果セットを取得します(これは、JDBCの5番目のステップではありませんか?ResultSet結果セットを取得します)
次に、結果をResultSetWrapperクラスにラップします
7. HandleResultSetメソッドを入力して、結果セットを処理します
結果セットクラスを処理するためのカスタムResultHandlerがない場合は、デフォルトでDefaultResultHandlerを使用して結果セットを処理します。
8. HandlerRowValuesメソッドを入力して、データの各行を処理します
handleRowValuesForSimpleResultMapは単純な結果マップです
handleRowValuesForNestedResultMapは、ネストされた結果マップ(マルチテーブルクエリ)です。
9.単純な結果マッピングを入力します
10.処理された結果をDefaultResultHandlerのリストコレクションに入れて、