Der Prozess von der Erstellung bis zur Ausführung von MapperMethod umfasst die Ausführung von SQL und die Rückgabe von Ergebnissen.
Der Prozess der Ausführung von SQL und der Rückgabe von Ergebnissen umfasst die Parametertypkonvertierung Es gibt ein relativ detailliertes Dokument auf der offiziellen Website von TypeHandler: http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers. Das Dokument erklärt hauptsächlich, wie TypeHandler verwendet wird Analysieren Sie den Quellcode im Zusammenhang mit TypeHandler.
1. Konfiguration
MyBatis verfügt über einen Standardtyphandler. Wenn Sie die Konfiguration anpassen müssen, ist dies ganz einfach. Fügen Sie die folgende Konfiguration zu mybatis-config.xml hinzu:
<typeHandlers> <typeHandler handler="org.mybatis.example.ExampleTypeHandler"/> </typeHandlers>
Lassen Sie uns den Prozess der Konfiguration von Leseeinstellungen analysieren. In XMLConfigBuilder gibt es eine Zeile für
/** * 读取配置文件组装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); } }
im obigen Quellcode.
typeHandlerElement(root.evalNode("typeHandlers"));
Schauen wir uns die typeHandlerElement-Methode an
/** * 读取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); } } } } }
Die Codelogik in if und else entspricht den beiden Konfigurationsmethoden von typeHandler >
typeHandlerRegistry.register()
wird am Ende aufgerufen. Das Obige ist die Beziehung zwischen TypeHandlerRegistry, Configuration und BaseTypeHandler.
Parameter festlegen
Wenn Sie Parameter festlegen, rufen Sie zuerst ParameterHandler.setParameters() auf, rufen Sie dann den entsprechenden typeHandler in setParameters() ab und rufen Sie schließlich typeHandler.setParameter() auf
Lass uns Schauen Sie sich die setParameter-Methode von BaseTypeHandler an
Wenn der Parameter nicht null ist, wird setNonNullParameter aufgerufen, was bedeutet, dass die Unterklasse den Quellcode zum Implementieren von setNonNullParameter
BigIntegerTypeHandler:
Zu diesem Zeitpunkt wurde die Rolle von TypeHandler grob analysiert.