Im Allgemeinen ist das Ändern des Quellcode des Frameworks äußerst riskant und ändert ihn nicht, es sei denn, er ist absolut erforderlich. Aber heute habe ich die SQLSessionFactoryBean -Klasse sorgfältig rekonstruiert, die offiziell von MyBatis bereitgestellt wird, die in den Frühling integriert ist. Erstens hat es eine Versuchs- und Irrtum -Mentalität, und zweitens hat es realistische Bedürfnisse.
Lassen Sie mich zuerst zwei Punkte erklären:
Im Allgemeinen bezieht sich Refactoring auf die Optimierung des Codes, ohne die Funktion zu ändern, aber das in diesem Artikel erwähnte Refactoring umfasst auch das Hinzufügen von Funktionen.
Die in diesem Artikel verwendeten Haupt-JAR-Pakete (Versionen): Spring-*-4.3.3.Release.jar, MyBatis-3.4.1.Jar, MyBatis-Spring-1.3.0.jar
Beginnen wir mit der Integration von MyBatis und Frühling.
1. Integrieren Sie MyBatis und Frühling
<bean id = "
Die Schlüsselklasse der Integration ist org.mybatis.spring.sqlSessionFactoryBean, eine Fabrikbean, die zur Generierung von MyBatis Global Session Factory SQLSessionFactory verwendet wird (dh die Fabrikbohnen, die die Sitzungsfabrik generiert), und SQLSessionFactory wird zu einer SQLSession -Objekts (SQLSessionFactory). SQLSession entspricht der Verbindung).
Wo Eigenschaften (konfiguriert mit P -Namespace oder untergeordnetem Eigenschaftselement):
DataSource ist eine Datenquelle, die mit DBCP, C3P0, Druid, JNDI-Lookup und anderen Methoden konfiguriert werden kann.
ConfigLocation ist eine globale Konfiguration der MyBatis -Engine, mit der das Verhalten von MyBatis geändert wird.
MapperLocations ist die SQLMapper -Skriptkonfigurationsdatei (Modus), die MyBatis geladen hat.
Natürlich gibt es viele andere Attribute, daher werde ich hier kein Beispiel geben.
2. Warum rekonstruieren
1. Optimierung der Quellcode -Optimierung
Die Funktion von SQLSessionFactoryBean besteht darin, SQLSessionFactory zu generieren. Schauen wir uns diese Methode an (SQLSessionFactoryBean.java Zeile 384-538): /*** Erstellen Sie eine {@Code sqlSessionFactory} Instanz. ** Die Standardimplementierung verwendet den Standard-MyBatis {@code xmlconfigBuilder} api, um ein API-API zu erstellen. 1.3.0 kann eine {@link -Konfiguration} Instanz direkt angegeben werden (ohne Konfigurationsdatei). (this.configuration! (this.configLocation! {LOGGER.debug("Property `configuration` or 'configLocation' not specified, using default MyBatis Configuration");}configuration = new Configuration();configuration.setVariables(this.configurationProperties);}if (this.objectFactory != null) {configuration.setObjectFactory(this.objectFactory);}if (this.ObjectWrapperFactory! tokenizeToStringArray (this.typealiaSespackage, configurableApplicationContext.config_location_delimiters); für (String packagetoscan: typealiaSpackagearray) {configuration.gettypealiasRegistry (). RegisterAliaSes (packagetoscan, typealiasSessuperType == null? Object.class: typealiasSessupertype); aliase ");}}} if (! isEmpty (this.typealiases)) {für (class <?> typealias: this.typealiases) {configuration.gettypealiasRegistry (). Registeralias (typealias); if (logger.isdebugenable () {) {logger.debugger.debugger (" {logger. "'");}}}if (!isEmpty(this.plugins)) {for (Interceptor plugin : this.plugins) {configuration.addInterceptor(plugin);if (LOGGER.isDebugEnabled()) {LOGGER.debug("Registered plugin: '" + plugin + "'");}}}if (HasLength (this.typeHandlerSpackage)) {String [] typeHandlerSpackagearray = tokenizetoStringArray (this.typeHandlerSpackage, configurableApplicationContext.config_location_delimiters); für (String packagetoscan: typeHandlerSpackagearray) {configuration.gettypeHandlerregistry (). Register (packagetoscan); if (logger.isdebugenabled ()) {Logger.debug ("Scanned Package: '" + Packagetoscan + "' for type Handler");}}}}}}}}}}}}}}}}}} if . (this.databaseIdProvider! (this.cache! = null) {configuration.addcache (this.cache);} if (xmlconfigBuilder! (Ausnahme ex) {Neue nestiosexception werfen ("Die Konfigurationsressource nicht analysiert:" + this.configLocation, ex);} schließlich {errorContext.instance () reset ();}} if (this.transactionFactory == null) {this.transactionory = newRanedTransactionFactory (). Umgebung (this.Environment, this.transactionFactory, thataTaSource)); if (! Isempty (this.mapperLocations)) {für (Ressourcen -MapperLocation: this.mapperLocations) {if (mapperLocation == null) {Fortsetzung; XmlMapperBuilder (mapperLocation.getInputStream (), configuration, mapPerLocation.toString (), configuration.getSQLFagments ()); xmlmapperBuilder.Parse ();} catch (Ausnahme E) {Wurf New NestioException ("versagte, um die Kartonressource zu parieren. {ErrorContext.instance (). Reset ();} if (logger.isdebugenabled ()) {logger.debug ("Parsed Mapper -Datei: '" + mapperLocation + "'");}}} else {if (logger.isdebuging () {) {) {) {) {) {) {logger {logger. gefunden ");}} return this.sqlSessionFactoryBuilder.build (Konfiguration);}Obwohl MyBatis ein hervorragendes Rahmen für Persistenzschicht ist, ist dieser Code in der Tat nicht sehr gut und hat viel Raum für Wiederaufbau und Optimierung.
2. Funktionale Expansion
(1) Verwenden Sie das Schema, um SQLMapper zu überprüfen
<!-DTD-Modus-> <xml Version = "1.0" coding = "utf-8"?> <! DocType mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapter.dtd"> <maper namespace = "org.dysd.dao.mybatis.config.iexampledao"> </mapper> <!-Schemasmodus-> <xml Version = "1.0" coding = "utf-8"?> <mapper xmlns: xsi = "http://wwwwwwwwww.ww.ww.ww.ww.w. xmlns = "http://dysd.org/schema/sqlmapper" xsi: schemalocation = "http://dysd.org/schema/sqlmapper http://dysd.org/schema/sqlmapper.xsd "namespace =" org.dysd.dao.mybatis.config.iexampledao "> </mapper>
Auf den ersten Blick ist die Verwendung von Schema komplizierter, aber in Kombination mit der IDE sind die automatischen Aufforderungen für die Verwendung von Schema freundlicher und die Überprüfungsinformationen sind klarer. Gleichzeitig öffnet es auch ein Fenster für andere Entwickler, mit denen sie den Namespace basierend auf dem vorhandenen Namespace anpassen können, z.
(2) Konfiguration anpassen. SQLSessionFactoryBean hat mehr Parameter für die benutzerdefinierte Konfiguration bereitgestellt. Es ist jedoch immer noch möglich, mehr personalisierte Einstellungen zu erfordern, z. B.:
A. Legen Sie den Standard -Ergebnistyp ein. Für <Select> Elemente, die nicht resultType und resultMap festlegen, können Sie den Standard -Rückgabe -Typ nach der Parsen auf die Karte festlegen, wodurch die Konfiguration von SQLMapper vereinfacht wird.
<!-vor vereinfacht-> <select id = "select" resultType = "map"> select * aus table_name wob
B. Erweitern Sie die ursprüngliche Parameteranalyse von MyBatis. Die native Parsing -Implementierung ist defaultParameterHandler. Diese Implementierung kann vererbt und erweitert werden. Zum Beispiel für den von SPEL vorangestellten Eigenschaftsausdruck: Verwenden Sie SPEL, um den Wert zu bewerten.
(3) Weitere Erweiterungen finden Sie im vorherigen Blog des Autors über MyBatis -Erweiterung
3. Machbarkeit des Wiederaufbaus
(1) In Bezug auf den Umfang des Codeeinflusses
Unten finden Sie die Vererbungsstruktur von SQLSessionFactoryBean
Daraus können wir sehen, dass das SQLSessionFactoryBean -Erbsystem nicht kompliziert ist und andere übergeordnete Klassen nicht erbt. Es implementiert nur drei Schnittstellen im Frühjahr (der EventListener in JDK ist nur ein Logo). Darüber hinaus richtet sich SQLSessionFactoryBean auf den Endentwicklungsbenutzer ohne Unterklassen und keine anderen Klassen, die sie anrufen. Daher ist es in Bezug auf den Umfang der Code -Auswirkungen sehr gering.
(2) In der Rekonstruktionsimplementierung können Sie eine neue SchemasqlSessionFactoryBean erstellen und dann den Code am Anfang vollständig kopieren, die SQLSessionFactoryBean vollständig kopieren, den Paketamen und den Klassennamen ändern und diese als Grundlage für die Rekonstruktion verwenden. Dies ist relativ einfach.
(3) In integrierten Anwendungen müssen Sie nur die Klassenattribute in der integrierten Konfiguration und in der Feder ändern.
Das obige ist das Refactoring der SQLSessionFactoryBean, die Ihnen in MyBatis und Spring integriert wurde. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!