Mybatisの初期化のためのMapper.xmlマッピングファイルの分析について話します

オファーが届きました。友達を掘って受け取りましょう!私は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();
  }
复制代码
  1. 現在のマッパーファイルがロードされていない場合は、configurationElement()メソッドを呼び出してマッパーファイルを解析します
  2. 繰り返しの読み込みを防ぐためにConfiguration.loadedResourcesコレクションに追加されました
  3. Mapperファイルに対応するMapperインターフェースを取得して登録します
  4. 解析に失敗したタグの処理
  5. 解析に失敗したタグの処理
  6. 解析に失敗した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);
    }
  }
复制代码
  1. Mapperファイルの名前空間属性を解析します
  2. タグを解析します。このタグは、他のキャッシュキャッシュを参照するために使用されます
  3. タグの解析、このタグはMybatisのセカンダリキャッシュを有効にするために使用されます。プライマリキャッシュはデフォルトで有効になっています。このメソッドでは、MapperBuilderAssistantクラスが解析され、Configuration.cachesのコレクションに保存されるキャッシュの作成が完了します。 。コレクションのキーは名前空間であり、値はCacheオブジェクトです。
  4. ラベルを解析します。このラベルは非推奨になりました。通常parameterType、パラメーターのクラス名を定義するために使用されます
  5. タグを解析します。このタグは結果マップであり、タグの下のすべてのサブタグが解析され、ResultMapオブジェクトに保存されます。具体的には、resultMapのタイプが最初に解析され、typeは結果セットの対象となるJavaオブジェクトです。マップされた後、resultMapタグのサブタグが解析されます。、、、などのラベルを含むラベルは、ResultMappingオブジェクトを生成し、id extendsなどのプロパティを取得し、ResultMapResolverオブジェクトを作成し、ResultMapオブジェクトを作成して保存します。 Configuration.resultMapsコレクション
  6. sqlタグを解析します。このタグは、繰り返し発生するsqlフラグメントを定義するために使用され、解析されてConfiguration.sqlFragmentsに保存されます。
  7. select> 、、、などのSQLノードを解析します。これらのタグは誰もがよく知っています。つまり、追加、削除、変更、チェックを行うSQLステートメントは、XMLStatementBuilderを介して解析され、最初にタグを解析してから、最後に、LanguageDriver.createSqlSource()メソッドによってSqlSourceオブジェクトが作成され、MappedStatementオブジェクトが構築されます。MappedStatementのsqlSourceはsqlステートメントを記録し、sqlCommandTypeはタイプを記録します。 Configuration.mappedStatementsコレクションに格納されているSQLステートメントの

要約する

この記事では主に、名前空間、キャッシュ、resultMap、sqlなどのタグを含むマッパーマッピングファイルの分析について説明します。最終的に、これらの情報は構成に保存されます。

おすすめ

転載: juejin.im/post/7079415745335001096