ResultSetHandler MyBatisのクラスは、ResultSetのキーのいずれかが処理カラムプレフィックス、論理ページを含む、JDBCマッピング処理を戻される弁別器(ディスクリミネータ、動的マッピング列に基づく値)処理などが挙げられます。
次のようにResultSetHandler StatementHandlerは、実行時に構築されました:
次ResultSetHandlerの定義を見て。主なものは、一般的な処理のクエリ結果に責任があるhandleResultSets、です。
パブリック インターフェースResultSetHandler { <E>リストの<E> handleResultSets(ステートメントVAR1)スローSQLExceptionが。 <E>カーソル<E> handleCursorResultSets(ステートメントVAR1)がスローSQLExceptionが。 空 handleOutputParameters(CallableStatementのVAR1)がスローSQLExceptionが。 }
次のようにStatementHandlerは、コールを完了された後handleResultSetsの実行:
結果セットの処理をカスタマイズするには、ここにソースコードを変更することができます。MyBatisのインターセプタは、4つの支持オブジェクト(エグゼキュータ、StatementHandler、ParameterHandler、ResultSetHandlerでサポートされているので )、 それはインターセプタを経ても可能である(参照MyBatisのカスタムプラグインの開発が説明)実装、LZは後者の、長所と短所を持っています。
HandleResultSets論理ページは、プロセスです。論理ページorg.apache.ibatis.session.RowBoundsによって実装され、それは以下に定義するよう構築された論理ページの実装は、アプリケーション層を定義しますが、めったに使われないMyBatisの。
// // のIntelliJ IDEAでの.classファイルから再作成ソースコード // (Fernflower逆コンパイラによって供給) // パッケージorg.apache.ibatis.session。 パブリック クラスRowBounds { パブリック 静的 最終 int型 NO_ROW_OFFSET = 0 。 パブリック 静的 最終 int型 = 2147483647 NO_ROW_LIMIT 。 公共の 静的な 最終 RowBoundsのDEFAULT = 新しいRowBounds(); 民間 最終 int型のオフセット。 民間 最終 int型の制限; パブリックRowBounds(){ この .offset = 0 。 この .limit = 2147483647 ; } 公共 RowBounds(intですオフセット、int型の制限){ この .offset = オフセット。 この .limit = 限界; } 公共 INT のgetOffset(){ 戻り 、この.offsetと、 } 公共 INT getLimit(){ 戻り 、この.limitと、 } }
デフォルト値はページングされていません。以下のように決定ShouldProcessMoreRows:
プライベート ブール shouldProcessMoreRows(ResultContext文脈、RowBounds rowBounds <?>)スローするSQLException { 返す context.isStoppedを()&& context.getResultCount()<!rowBounds.getLimitを(); }
次のように各列の処理は、第一の方法は、明示的属性(このresultMapでどれか)をマッピングし、処理は、明示的にマップされていない場合。
プライベートオブジェクトgetRowValueは(ResultSetWrapper RSW、このresultMapこのresultMap)スローSQLExceptionが{ ResultLoaderMap lazyLoader = 新しいResultLoaderMap()。
//创建目标类型对象、如POJO或マップ オブジェクトrowValue = この .createResultObject(RSW、このresultMap、lazyLoader、(文字列)はnull ); もし(rowValue!= NULL &&!この.hasTypeHandlerForResultObject(RSW、resultMap.getType())){ メタオブジェクトメタオブジェクト = この.configuration.newMetaObject(rowValue)。 ブール foundValues = この.useConstructorMappings; もし(この .shouldApplyAutomaticMappings(このresultMap、偽)){ // マップ就是在这里自动映射的 foundValues = この .applyAutomaticMappings(RSW、このresultMap、メタオブジェクト(文字列)NULL)|| foundValues; } foundValues = この .applyPropertyMappings(RSW、このresultMap、メタオブジェクト、lazyLoader、(文字列)NULL)|| foundValues; foundValues = lazyLoader.size()> 0 || foundValues; rowValue =!foundValues &&!この .configuration.isReturnInstanceForEmptyRow()?ナル:rowValue。 } 戻りrowValue。 }
各ラインのためのプロセスを記録またはマッピングするために使用されるResultHandler、で次見て、二次フィルタまたは脱感作治療の典型的な例として、ここで処理することができ、もちろん、プラグインすることができるが、ここで、処理パフォーマンスの観点から最も良いです。その定義は単純です。
// // のIntelliJ IDEAでの.classファイルから再作成ソースコード // (Fernflower逆コンパイラによって供給) // パッケージorg.apache.ibatis.session。 パブリック インターフェース ResultHandler <T> { ボイド handleResult(ResultContext <?延び T> VAR1)。 }
相対的に言って、ResultHandlerの実装はここで、非常に簡単です説明することはありませんが、本当に知りたいhttps://www.cnblogs.com/51life/p/9633002.htmlを参照することができます。