ホームページ  >  記事  >  php教程  >  mybatisソースコード解析のTypeHandler

mybatisソースコード解析のTypeHandler

高洛峰
高洛峰オリジナル
2016-11-22 12:50:341468ブラウズ

MapperMethodの作成から実行までのプロセスを解析しました

MapperMethodの実行にはSQLの実行と結果の返却が含まれており、この処理はTypeHandlerによって処理されます。 TypeHandler の比較的詳細なドキュメント http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers には、TypeHandler の使用方法が主に説明されています。以下の分析では、TypeHandler に関連するソース コードが説明されています。 .

1. 構成

MyBatis にはデフォルトのタイプのプロセッサーがあり、構成をカスタマイズする必要がある場合は、次の構成を mybatis-config.xml に追加するのが非常に簡単です。 XMLConfigBuilder で設定を読み取るプロセス

<typeHandlers>
  <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>

上記のソース コードには

   /**
     * 读取配置文件组装configuration
     * @param root 配置文件的configuration节点
     */
  private void parseConfiguration(XNode root) {    try {      //issue #117 read properties first
      propertiesElement(root.evalNode("properties"));
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      loadCustomVfs(settings);
      typeAliasesElement(root.evalNode("typeAliases"));
      pluginElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
      settingsElement(settings);      // read it after objectFactory and objectWrapperFactory issue #631
      environmentsElement(root.evalNode("environments"));
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      typeHandlerElement(root.evalNode("typeHandlers"));
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }

という行があります。 typeHandlerElement メソッドを見てみましょう

typeHandlerElement(root.evalNode("typeHandlers"));

if と else のコード ロジックは、typeHandler の 2 つの設定メソッドに対応しています。最後に、それは

/**
   * 读取typeHandlers配置并注册
   * @param parent 配置文件typeHandlers节点
   * @throws Exception
   */
  private void typeHandlerElement(XNode parent) throws Exception {    if (parent != null) {      for (XNode child : parent.getChildren()) {        if ("package".equals(child.getName())) {
          String typeHandlerPackage = child.getStringAttribute("name");          typeHandlerRegistry.register(typeHandlerPackage);
        } else {
          String javaTypeName = child.getStringAttribute("javaType");
          String jdbcTypeName = child.getStringAttribute("jdbcType");
          String handlerTypeName = child.getStringAttribute("handler");
          Class<?> javaTypeClass = resolveClass(javaTypeName);
          JdbcType jdbcType = resolveJdbcType(jdbcTypeName);
          Class<?> typeHandlerClass = resolveClass(handlerTypeName);          if (javaTypeClass != null) {            if (jdbcType == null) {              typeHandlerRegistry.register(javaTypeClass, typeHandlerClass);
            } else {              typeHandlerRegistry.register(javaTypeClass, jdbcType, typeHandlerClass);
            }
          } else {            typeHandlerRegistry.register(typeHandlerClass);
          }
        }
      }
    }
  }

mybatisソースコード解析のTypeHandler と呼ばれます。 上記は、TypeHandler と TypeHandlerRegistry、Configuration、および BaseTypeHandler の関係です。

2. パラメータを設定する

パラメータを設定するときは、最初に ParameterHandler.setParameters() を呼び出します。次に、setParameters() で対応する typeHandler を取得し、最後に typeHandler.setParameter() を呼び出します

mybatisソースコード解析のTypeHandlerBaseTypeHandler の setParameter メソッドをもう一度見てみましょう

パラメータが null でない場合、setNonNullParameter が呼び出されます。これは、次のことを意味しますサブクラスはsetNonNullParameterを実装する必要があります

BigIntegerTypeHandlerのソースコード:

typeHandlerRegistry.register()

この時点で、TypeHandlerの役割は大まかに分析されました

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。