Wie wir alle wissen, MyBatisMyBatis是对JDBC进行封装而成的产品,所以,聊MyBatis源码之前我们得先了解JDBC。
JDCB
JDBC案例:
public class JdbcDemo {
public static final String URL = "jdbc:mysql://localhost:3306/mblog";
public static final String USER = "root";
public static final String PASSWORD = "123456";
public static void main(String[] args) throws Exception {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
while(rs.next()){
System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
}
}
}
至于 jpa,它只是一个规范标准, 并非具体框架, 不等同于spring-data-jpa;同时 spring-data-jpa 也不是 jpa 的具体实现, 它只是 jpa 规范标准的进一步封装.hibernate 是 jpa 最为常见的实现框架,当然其他还有 eclipseLink,topLink。MyBatis 的特点是在对 SQL 优化时, 除了部分可以自动生成代码, Verwenden Sie die SQL-Anweisung, um die SQL-Anweisungen anzuzeigen.
spring-data-jpa(hibernate) 的特点是在开发过程中,脱离 SQL 编码开发,当然也支持本地SQL来查询,框架内部调用层次复杂.
以上就可以根据实际的业务进度和业务支撑情况做出选择了.
MyBatis其实可以在一个项目Verwenden Sie MyBatis für spring-data-jpa und verwenden Sie SQL für mybatis und verwenden Sie SQL für spring-data-jpa.
🎜🎜鉴于前实际开发中使用数量,我们选择🎜 进行分析。🎜
mybatis
Freunde, die neu in der Entwicklung sind, kennen den Vorgänger von MyBatis möglicherweise nicht. Vor 2010 haben sie MyBatis, genannt ibatis. MyBatis ,叫ibatis。
MyBatis kann einfaches XML oder Anmerkungen zum Konfigurieren verwenden und native Informationen zuordnen, kombinieren Sie die Schnittstelle mit Javas MySQL数据库连接jar包。
wird verwendet, um Die Hauptkonfigurationsinformationen von MyBatis. Wenn andere Komponenten die Konfigurationsinformationen erhalten müssen, können sie Konfiguration Objekterfassung. Darüber hinaus verwendet MyBatis Mapper-Konfigurationsinformationen, Typalias, TypeHandler usw. sind registriert bei Konfiguration Komponente: Wenn andere Komponenten diese Informationen benötigen, können sie auch Konfiguration Objekt. MyBatis的主配置信息,其他组件需要获取配置信息时,直接通过Configuration对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler等注册到Configuration组件中,其他组件需要这些信息时,也可以从Configuration对象中获取。
🎜🎜MappedStatement🎜🎜🎜🎜MappedStatement wird verwendet, um die SQL-Konfigurationsinformationen in Mapper zu beschreiben. Es ist ein Paar von Mapper XMLIn der Konfigurationsdateib5d5a6a8d1a81baf21ea188537c0af35 und andere Tags oder @Select/@Update und andere Kapselung von Anmerkungskonfigurationsinformationen. 🎜🎜🎜🎜SqlSession🎜🎜🎜🎜
Executor
🎜🎜StatementHandler🎜🎜🎜🎜MyBatis</ code>Der vom Framework verwendete Anweisungstyp ist <code style=" font-size: rgba mono consolas monaco menlo monospace break-all rgb>CallableStatement code> und<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05 ); Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>PreparedStatement, ResultSetHandler</code > Kapselt die Operation von ResultSet-Objekten in JDBC. Bei der Ausführung einer SQL-Anweisung vom Typ SELECT wird ResultSetHandler verwendet, um die Abfrageergebnisse in Java-Objekte zu konvertieren. 🎜<h4 data-tool=" mdnice><span style="display: none;"></span>TypeHandler<span style="display: none;"></span><p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;"><code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: „Operator Mono“, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);“>TypeHandler Es handelt sich um einen Typprozessor in MyBatis, der für die Zuordnung zwischen Java-Typen und JDBC-Typen verwendet wird. Seine Funktion spiegelt sich hauptsächlich in der Fähigkeit wider, setXXX()-Methode legt den Wert fest für das Statement-Objekt. Und kann den entsprechenden TypeHandler是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement或CallableStatement对象对应的setXXX()方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()获取SQL执行结果。
使用JDBC API
Verwenden Sie
PreparedStatement interface Eine Reihe von PreparedStatement接口中提供的一系列的setXXX()方法,将Java类型转换为对应的JDBC类型并为参数占位符赋值。
Führen Sie die SQL-Anweisung aus, um ResultSet-Objekt, müssen Sie den getXXX() ruft den Feldwert ab und zu diesem Zeitpunkt wird der JDBC-Typ in einen Java-Typ konvertiert.
TypeHandler und Java-Typen und JDBC-Korrespondenz zwischen Typen : 🎜
🎜 Figure>
Zusammenfassung
Wir haben SqlSession-Komponente, die eine API auf Benutzerebene ist. EigentlichSQL wirklich ausführen Operation ist die Executor-Komponente und kann als SQL-Executor verstanden werden. Sie verwendet StatementHandler-Komponente arbeitet mit dem JDBC-Statement-Objekt. 🎜
Wenn der Anweisungstyp PreparedStatement, der Parameter wird vom ParameterHandler belegt Zuweisung von Komponentenzeichen. ParameterHandler Komponente findet die entsprechende entsprechend der Java-Typ <code style="font" bereitgestellt von statement> object -size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " Operator Mono ", Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(239, 112, 96);">setXXX() Methode (wie setString() Methode) ist im Parameter-Platzhalter-Einstellungswert des Statement-Objekts. CallableStatement和PreparedStatement时,会通过ParameterHandler组件为参数占位符赋值。ParameterHandler组件中会根据Java类型找到对应的TypeHandler对象,TypeHandler中会通过Statement对象提供的setXXX()方法(例如setString()方法)为Statement对象中的参数占位符设置值。
ResultSetHandler-Komponente ruft das ResultSet-Objekt vom Statement-Objekt ab und konvertiert dann das ResultSet-Objekt in ein Java-Objekt.
Erweiterte Fähigkeiten
Designmuster
Designmuster werden in MyBatis häufig verwendet. In MyBatis können wir verschiedene Designmuster erlernen:🎜
Factory-Muster
Template-Methodenmuster
Agent-Muster
Builder-Muster
Singleton-Muster
Anpassungsmuster
Dekorationsmodus
Verantwortungskettenmuster
....
Caching
In Webanwendungen ist Caching ein wesentlicher Bestandteil. Normalerweise verwenden wir Caching-Middleware wie Redis oder Memcached, um eine große Anzahl von Anfragen an die Datenbank abzufangen und den Druck auf die Datenbank zu verringern. Als wichtiger Baustein sorgt MyBatis selbstverständlich auch intern für entsprechenden Support. Durch das Hinzufügen von Caching-Funktionen auf Framework-Ebene kann der Druck auf die Datenbank verringert und gleichzeitig die Abfragegeschwindigkeit verbessert werden. Man kann sagen, dass damit zwei Fliegen mit einer Klappe geschlagen werden.
Die Cache-Struktur von MyBatis besteht aus 一级缓存和二级缓存 Beide Cache-Ebenen sind Implementierungsklassen, die die Cache-Schnittstelle verwenden. Daher werde ich Ihnen in den folgenden Kapiteln zunächst den Quellcode mehrerer Cache-Implementierungsklassen vorstellen und anschließend die Implementierung des First-Level- und Second-Level-Cache analysieren.
Verwendung von MyBatis First-Level-Cache und Second-Level-Cache: MyBatis First-Level-Cache ist ein SqlSession-Level-Cache, der standardmäßig aktiviert ist und nicht durch Einstellung deaktiviert werden kann; der Parameterwert „cacheEnabled“ in der MyBatis-Hauptkonfigurationsdatei.
Der Cache der ersten Ebene ist im Executor implementiert. Die Executor-Komponente von MyBatis verfügt über drei verschiedene Implementierungen, nämlich BaseExecutor code>, in BaseExecutor In der query()-Methode der Klasse werden die Abfrageergebnisse zunächst aus dem Cache abgerufen. Wenn die Ergebnisse nicht abgerufen werden können, werden die Ergebnisse aus der Datenbank abgerufen und anschließend zwischengespeichert. Der Second-Level-Cache von MyBatis wird über den Decorator-Modus implementiert. Wenn der Second-Level-Cache über den Parameter „cacheEnabled“ aktiviert wird, verwendet das MyBatis-Framework CachingExecutor, um SimpleExecutor, ReuseExecutoroder BatchExecutor ist dekoriert. Wenn ein Abfragevorgang ausgeführt wird, werden die Abfrageergebnisse zwischengespeichert, und wenn ein Aktualisierungsvorgang ausgeführt wird, wird der sekundäre Cache aktualisiert. In diesem Kapitel wird schließlich SimpleExecutor、ReuseExecutor和BatchExecutor。这些类都继承自BaseExecutor,在BaseExecutor类的query()方法中,首先从缓存中获取查询结果,如果获取不到,则从数据库中查询结果,然后将查询结果缓存起来。而MyBatis的二级缓存则是通过装饰器模式实现的,当通过cacheEnabled参数开启了二级缓存,MyBatis框架会使用CachingExecutor对SimpleExecutor、ReuseExecutor或者BatchExecutor进行装饰,当执行查询操作时,对查询结果进行缓存,执行更新操作时则更新二级缓存。本章最后介绍了MyBatis如何整合Redis作为二级缓存。
除此之外,MyBatis还支持Ehcache、OSCache
Darüber hinaus unterstützt MyBatis auch Plug-ins
Die meisten Frameworks unterstützen Plug-ins, indem sie Plug-ins schreiben, und Mybatis bildet da keine Ausnahme. MyBatis bietet einen Erweiterungsmechanismus, der das Ausführungsverhalten von SQL beim Ausführen von Mapper ändern kann. Dieser Erweiterungsmechanismus wird durch Interceptoren implementiert, und benutzerdefinierte Interceptoren werden auch als MyBatis-Plug-Ins bezeichnet. 🎜Das
MyBatis-Framework unterstützt das Abfangen von Executor、ParameterHandler、ResultSetHandler、StatementHandlervier Komponentenmethoden. Beherrschen Sie das Implementierungsprinzip des MyBatis-Plug-Ins und implementieren Sie dann ein Paging-Abfrage-Plug-In und ein langsames SQL-Statistik-Plug-In. Wenn die von uns benötigten Funktionen vom MyBatis-Framework nicht erfüllt werden können, können wir erwägen, sie über ein benutzerdefiniertes Plug-In zu implementieren -ins.
Klassische Implementierung: PageHelper.
Log
MyBatis stellt entsprechende Implementierungen der Log-Schnittstelle für verschiedene Protokollierungsframeworks bereit. Die Implementierungsklasse der Log-Schnittstelle ist in der folgenden Abbildung dargestellt. Wie aus der Implementierungsklasse hervorgeht, unterstützt MyBatis wie folgt sieben verschiedene Protokollimplementierungen.
Das Folgende ist eine kurze Erklärung einiger häufig verwendeter:
Apache Commons-Protokollierung: Verwenden Sie JCL, um Protokolle auszugeben.
Log4j 2: Verwenden Sie das Log4j 2-Framework zur Eingabe von Protokollen.
Java Util Logging: Verwenden Sie das integrierte Protokollierungsmodul des JDK, um Protokolle auszugeben.
Log4j: Verwenden Sie das Log4j-Framework, um Protokolle auszugeben.
Keine Protokollierung: Es werden keine Protokolle ausgegeben.
SLF4J: Verwenden Sie die SLF4J-Protokollfassade, um Protokolle auszugeben.
Stdout: Protokolle auf dem Standardausgabegerät (z. B. der Konsole) ausgeben.
Die Reihenfolge, in der MyBatis nach Log-Frameworks sucht, ist
SLF4J→JCL→Log4j2→Log4j→JUL→No Logging.
Wenn unter dem Klassenpfad kein Protokollierungsframework vorhanden ist, wird die Protokollimplementierungsklasse NoLoggingImpl verwendet, dh es werden keine Protokolle ausgegeben.
Dynamische SQL-Bindung
Dynamisches SQL bezieht sich auf die Tatsache, dass die spezifischen Bedingungen nicht im Voraus vorhergesagt werden können und SQL-Anweisungen zur Laufzeit entsprechend der spezifischen Situation dynamisch generiert werden müssen.
Es gibt umfangreiche dynamische SQL-Tags in MyBatis, wie zum Beispiel: c1a813496a954f02bd621357490d285bWarte. 196185dae55b7edbe154a5051db664a7、f3bf5eff46860b27119c8dd4e92f1e57、7c3646f85db7ce074bf2e07d38d2c6e1、800a174bf160103126f2a6097b3e44a4等。
Im MyBatis-Quellcode gibt es ein SqlSource-Objekt, das im MappedStatement-Objekt als Eigenschaft des MappedStatement-Objekts gespeichert wird. Wenn Mapper ausgeführt wird, wird die Methode getBoundSql() des SqlSource-Objekts basierend auf den eingehenden Parameterinformationen aufgerufen, um das BoundSql-Objekt abzurufen. Dieser Prozess schließt den Prozess der Konvertierung des SqlNode-Objekts in eine SQL-Anweisung ab.
Zum Beispiel:, Zusammenfassung
Dieser Artikel ist die Gesamterfahrung der MyBatis-Quellcode-Analyse. Ich hoffe, er wird Ihnen hilfreich sein. 🎜🎜🎜
Das obige ist der detaillierte Inhalt vonNachdem ich den MyBatis-Quellcode in einer Woche gelernt hatte, erhielt ich eine Zusammenfassung mit 10.000 Wörtern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!