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); } } } } }
と呼ばれます。 上記は、TypeHandler と TypeHandlerRegistry、Configuration、および BaseTypeHandler の関係です。
2. パラメータを設定する
パラメータを設定するときは、最初に ParameterHandler.setParameters() を呼び出します。次に、setParameters() で対応する typeHandler を取得し、最後に typeHandler.setParameter() を呼び出します
BaseTypeHandler の setParameter メソッドをもう一度見てみましょう
パラメータが null でない場合、setNonNullParameter が呼び出されます。これは、次のことを意味しますサブクラスはsetNonNullParameterを実装する必要があります
BigIntegerTypeHandlerのソースコード:
typeHandlerRegistry.register()
この時点で、TypeHandlerの役割は大まかに分析されました
。