オファーが届きました。友達を掘って受け取りましょう!私は2022年の春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示します。
Mybatisの初期化のためのMapper.xmlマッピングファイルの分析について話します
完全な構成ファイルを解析した後、次のステップは、XMLMapperBuilderを介して解析されるMapperファイルを解析することです。
XMLMapperBuilderのparse()メソッド:
public void parse() {
if (!configuration.isResourceLoaded(resource)) {
configurationElement(parser.evalNode("/mapper"));
configuration.addLoadedResource(resource);
bindMapperForNamespace();
}
parsePendingResultMaps();
parsePendingCacheRefs();
parsePendingStatements();
}
复制代码
- 現在のマッパーファイルがロードされていない場合は、configurationElement()メソッドを呼び出してマッパーファイルを解析します
- 繰り返しの読み込みを防ぐためにConfiguration.loadedResourcesコレクションに追加されました
- Mapperファイルに対応するMapperインターフェースを取得して登録します
- 解析に失敗したタグの処理
- 解析に失敗したタグの処理
- 解析に失敗したSQLステートメントの処理
XMLMapperBuilderクラスのconfigurationElement()メソッドに注目してください。
private void configurationElement(XNode context) {
try {
String namespace = context.getStringAttribute("namespace");
if (namespace == null || namespace.isEmpty()) {
throw new BuilderException("Mapper's namespace cannot be empty");
}
builderAssistant.setCurrentNamespace(namespace);
cacheRefElement(context.evalNode("cache-ref"));
cacheElement(context.evalNode("cache"));
parameterMapElement(context.evalNodes("/mapper/parameterMap"));
resultMapElements(context.evalNodes("/mapper/resultMap"));
sqlElement(context.evalNodes("/mapper/sql"));
buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
} catch (Exception e) {
throw new BuilderException("Error parsing Mapper XML. The XML location is '" + resource + "'. Cause: " + e, e);
}
}
复制代码
- Mapperファイルの名前空間属性を解析します
- タグを解析します。このタグは、他のキャッシュキャッシュを参照するために使用されます
- タグの解析、このタグはMybatisのセカンダリキャッシュを有効にするために使用されます。プライマリキャッシュはデフォルトで有効になっています。このメソッドでは、MapperBuilderAssistantクラスが解析され、Configuration.cachesのコレクションに保存されるキャッシュの作成が完了します。 。コレクションのキーは名前空間であり、値はCacheオブジェクトです。
- ラベルを解析します。このラベルは非推奨になりました。通常
parameterType
、パラメーターのクラス名を定義するために使用されます - タグを解析します。このタグは結果マップであり、タグの下のすべてのサブタグが解析され、ResultMapオブジェクトに保存されます。具体的には、resultMapのタイプが最初に解析され、typeは結果セットの対象となるJavaオブジェクトです。マップされた後、resultMapタグのサブタグが解析されます。、、、などのラベルを含むラベルは、ResultMappingオブジェクトを生成し、id extendsなどのプロパティを取得し、ResultMapResolverオブジェクトを作成し、ResultMapオブジェクトを作成して保存します。 Configuration.resultMapsコレクション
- sqlタグを解析します。このタグは、繰り返し発生するsqlフラグメントを定義するために使用され、解析されてConfiguration.sqlFragmentsに保存されます。
- select> 、、、などのSQLノードを解析します。これらのタグは誰もがよく知っています。つまり、追加、削除、変更、チェックを行うSQLステートメントは、XMLStatementBuilderを介して解析され、最初にタグを解析してから、最後に、LanguageDriver.createSqlSource()メソッドによってSqlSourceオブジェクトが作成され、MappedStatementオブジェクトが構築されます。MappedStatementのsqlSourceはsqlステートメントを記録し、sqlCommandTypeはタイプを記録します。 Configuration.mappedStatementsコレクションに格納されているSQLステートメントの
要約する
この記事では主に、名前空間、キャッシュ、resultMap、sqlなどのタグを含むマッパーマッピングファイルの分析について説明します。最終的に、これらの情報は構成に保存されます。