Mybatis原理分析(4)-クエリプロセス

最初の3つのMybatisの原理分析は、次のリンクをクリックして表示できます。

Mybatisの原理分析(1)グローバルxml構成ファイルを解析してSqlSessionFactoryプロセスを生成する

Mybatis原理分析(2)SqlSessionの作成プロセス

Mybatis原理分析(3)-getMapperはインターフェイス実装クラスを動的に取得します

この記事では、主に最初の3つの記事(追加、削除、変更と同じ)に基づいたMybatisのクエリプロセスについて説明し、Mybatisのコア知識でもあります。あまり言いませんが、デバッグは尊重されます。

3番目の記事で、取得したMapperインターフェイスオブジェクトは実際にはプロキシ実装クラスであり、プロキシはMapperProxyオブジェクトであり、MapperProxyオブジェクトはMapperインターフェイスを実装していないため、プロキシクラスのインターフェイスメソッドを呼び出すと述べました。 、invokeメソッドは、それがObjectクラスのメソッドであるかどうかを判断する条件を提供します(ここでそのような判断がない場合、プログラムはエラーを報告します。詳細については、第3章の説明を参照してください)。Objectメソッドではなく、インターフェイスメソッドを呼び出していることは明らかです。 、したがって、プログラムはcachedMapperMethodメソッドに直接アクセスします。このメソッドの詳細は

 これは実際には、MapperMethedをキャッシュするためのマップコンテナを介した最適化です。キーは呼び出されたインターフェイスメソッドMethodであり、値はMapperMethodです。このMapperMethodには2つの主要な属性があります。

SqlCommandオブジェクトの1つです。次に、このSqlCommandの内容を見て、そのコンストラクターに行きましょう。

まず、MapperMethodの内部クラスです。nameとtypeの2つの属性があります。次に、これら2つの属性の機能を直接説明します。name属性は、渡されたインターフェイスとメソッドに従って呼び出すものを取得します。メソッドのフルパス名はConfigurationに移動して、対応するMappedStatementを取得し、MappedStatementオブジェクトのIDを名前に割り当てます。タイプは同じで、MappedStatementのsqlCommandTypeを割り当てることによっても取得されます。もう1つのMethodSignatureもMapperMethodの内部クラスであり、その機能は、呼び出しが返されるインターフェイスメソッドのタイプを決定することです。ここでは説明しません。

上記の2つのクラスは、実際には次の基礎を築いています。[次へ]をクリックし、mapperMethod.executeメソッドに移動して、さらに詳しく説明します。

ここで最初に行うことは、MapperMethodのSqlCommandのタイプによってメソッドタイプを判断することであることがわかります。ここではクエリメソッドであるため、SELECTブランチに到達しました。

SELECTブランチでは、メソッドの戻り値が再度判断され、メソッドの戻り値に応じて分岐が行われるかどうかが異なります。明らかに、ここでの条件付き判断は、前述のMethodSignatureのクレジットです。次に、sqlSession.selectOneメソッドが登場し、メソッドのフルパス名と呼び出されるインターフェイスメソッドパラメーターが渡され、さらに深く掘り下げられました。

 selectListメソッドに飛び込みます。

もっと深く行きなさい。

 前のsqlCommondのname値に従って、対応するMappedStatementオブジェクトがConfigurationオブジェクトで取得され、executor.queryメソッドが呼び出されていることがわかります。wrapCollectionメソッドがあることに注意してください。名前から、パラメーターオブジェクト用にラップする必要があることがわかります。ここではあまりありません。次に、クエリメソッドについて詳しく説明します。

BoundSqlオブジェクトは、元のSQLステートメントを含む着信MappedStatementのgetBoundSqlメソッドを介して取得できます。また、CacheKeyはセカンダリキャッシュに使用されるキー値です。以下のクエリメソッドについて詳しく説明します。

 CachingExecutorのクエリメソッドは、デフォルトで2番目のレベルのキャッシュを構成しているため、ここで呼び出されます。実際に実行するExecutorはCachingExcutorによってラップされます。ここでは、2番目の部分で説明するため、詳細については説明しません。次に、セカンダリキャッシュにデータがない場合は、実際のエグゼキュータを呼び出す必要があります。デリゲート.queryメソッドを深く掘り下げます。

これは第2レベルのキャッシュに似ており、最初にローカルキャッシュ、つまり第1レベルのキャッシュからフェッチされるため、Mybatisのデータソースの順序は、最初に第2レベルのキャッシュ、次に第1レベルのキャッシュ、最後にデータベースであることがわかります。queryFromDataBaseメソッドについて詳しく説明します。 

詳細なdoQueryメソッド

 このとき、SimpleExecutorのdoQueryメソッドに行きました。最初に、着信MappedStatementオブジェクトからConfigurationオブジェクトを取得し、次に構成のnewStatementHandlerメソッドを呼び出したことがわかりました。このメソッドはStatementHandlerオブジェクトを返し、このメソッドに深く入り込みました。

RoutingStatemnetHandlerオブジェクトが最初にサブクラスを介して作成されたことがわかります。このRoutingStatemnetHandlerオブジェクトとは何ですか。その工法を見てみましょう。

そのプロパティには、StatementHandlerプロパティオブジェクトがあります。実際、このプロパティオブジェクトは、このクラスのメソッドの実際の実行オブジェクトです。つまり、RoutingStatementHandlerは実際にはパッケージングのレイヤーであり、このオブジェクトの作成は構成ファイルに基づいています。で設定されたstatementTypeを決定するために、デフォルトでは、プリコンパイルされたPrepareStatementHandlerが作成されます。

次に、上の赤いボックスにあるコードinterceptorChain.pluginAll(statementHandler)を見てください。これは非常によく知られているコードです。実際、このコードは、Executorを初期化したときに表示されました。このコードは、次のコードにも表示されます。 Mybatisのプラグインメカニズムに関連しています。では、このStatementHandlerオブジェクトは何ですか?最初に次のコードを実行してみましょう。

newStatementHandlerメソッドを実行した後、以下のprepareStatementメソッドにアクセスして、このメソッドについて詳しく説明します。

実際、StatementHandlerオブジェクトはStatementオブジェクトを取得するために使用され、このStatementオブジェクトはJDBCプログラミングを学習しているときにjdkのStatementオブジェクトであるため、Mybatisによるデータベースの操作は実際にはJDBCをカプセル化します。StatementHandlerがステートメントを取得する方法を見て、handler.prepareに移動しましょう。

prepareStatementのprepareメソッドが呼び出され、このメソッドが詳細に使用されていることがわかります。

 ここで、boundSqlからsqlステートメントを取得し、connection.prepareStatementメソッドを呼び出してsqlを渡すと、Statementオブジェクトが取得されます。

次にhandler.parameterize(stmt)が来て、それから入って見てみました。

parameterHandlerのsetParametersメソッドが内部で呼び出され、このparameterHandlerオブジェクトは何ですか?前のPreparedStatementHandlerの初期化に戻りましょう。

PreparedStatementHandlerにはそのようなparameterHandlerオブジェクトはなく、PreparedStatementHandlerはBaseStatementHandlerから継承されるため、初期化parameterHandlerオブジェクトはその親クラスBaseStatementHandlerの構築メソッドに含まれている必要があります。

BaseStatementHandlerの構築メソッドに移動し、configuration.newParameterHandlerメソッドを詳しく調べます。

newParameterHandlerとnewResultSetHandlerの両方に、Mybatisプラグインを呼び出すメカニズムがあることがわかります。現在、Mybatisプラグインによってインターセプトできる4つのオブジェクトは、Executor、StatementHandler、ParameterHandler、およびResultSetHandlerであることがわかっています。実際これらの4つのオブジェクトは、Mybatisプラグインによってインターセプトできます。Mybatisでは、これをMybatisと呼びます。 4つの主要なコンポーネント。

おすすめ

転載: blog.csdn.net/weixin_37689658/article/details/99617925