Heim > Java > javaLernprogramm > Nachdem ich den MyBatis-Quellcode in einer Woche gelernt hatte, erhielt ich eine Zusammenfassung mit 10.000 Wörtern

Nachdem ich den MyBatis-Quellcode in einer Woche gelernt hatte, erhielt ich eine Zusammenfassung mit 10.000 Wörtern

Freigeben: 2023-08-23 14:51:14
nach vorne
1230 Leute haben es durchsucht

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"));
        }
    }
}
Nach dem Login kopieren

说明:

数据库驱动:

Class.forName("com.mysql.jdbc.Driver");
Nach dem Login kopieren

获取连接:

Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Nach dem Login kopieren

创建Statement或者PreparedStatementJa

JDBC🎜 ist ein gekapseltes Produkt. Bevor wir also über den MyBatis-Quellcode sprechen, müssen wir ihn zunächst verstehen🎜<span style="display: none;">🎜<span style="display: inline-block;Hintergrund: rgb(239, 112, 96);Farbe: rgb(255, 255, 255 );padding: 3px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;">JDCB🎜<span style="display: inline-block; -align: bottom;border-bottom: 36px solid #efebe9;border-right: 20px solid transparent;"> 🎜<p data-tool="mdnice editor" style="padding-top: 8px padding- unten: 8px;Linienhöhe: 26px;Rand oben: 1px;Rand unten: 1px;">JDBC-Fall: 🎜</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">Statement stmt = conn.createStatement();</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div> <p data-tool="mdnice editor" style="padding-top: 8px ;padding- unten: 8px;Linienhöhe: 26px;Rand oben: 1px;Rand unten: 1px;">Beschreibung: 🎜</p> <p data-tool="mdnice editor" style="padding-top: 8px; 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Datenbanktreiber: 🎜</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">ResultSet rs = stmt.executeQuery(&quot;SELECT id, name, age FROM m_user where id =1&quot;);</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div> <p data-tool="mdnice editor" style="padding-top: 8px ;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">Get link:🎜</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">System.out.println(&quot;name: &quot;+rs.getString(&quot;name&quot;)+&quot; 年龄:&quot;+rs.getInt(&quot;age&quot;));</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div> <p data-tool="mdnice editor" style="padding-top: 8px;padding-bottom: 8px;Linienhöhe: 26px;Rand oben: 1px;Rand unten: 1px;">Erstellen<code style="font-size: 14px;padding: 2px 4px;Randradius: 4px ;Rand rechts: 2px ;Rand links: 2px;Hintergrundfarbe: rgba(27, 31, 35, 0,05);Schriftfamilie: „Operator Mono“, Consolas, Monaco, Menlo, Monospace;Wortumbruch: break -all;Farbe: rgb (239, 112, 96);">Anweisungoder PreparedStatementObjekt: 🎜

Statement stmt = conn.createStatement();
Nach dem Login kopieren
Nach dem Login kopieren

执行sql数据库查询:

ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM m_user where id =1");
Nach dem Login kopieren
Nach dem Login kopieren

解析结果集:

System.out.println("name: "+rs.getString("name")+" 年龄:"+rs.getInt("age"));
Nach dem Login kopieren
Nach dem Login kopieren

在使用的时候,业务处理完成后记得关闭相关资源

使用过JDCB的朋友都知道,JDBC如果用到我们项目中基本上都会存在以下几个问题:

传统JDBC的问题

  • 创建数据库的连接存在大量的硬编码,
  • 执行statement时存在硬编码.
  • 频繁的开启和关闭数据库连接,会严重影响数据库的性能,浪费数据库的资源.
  • 存在大量的重复性编码

针对上面这些问题,于是一大堆持久化框架应运而生。

持久化框

做持久层的框架有很多,有orm系和utils系列。

  • orm系列的代表有: hibernateeclipseLinktopLinkorm系列的代表有:hibernateeclipseLinktopLink
  • utils系列的代表有:MyBatisdbUtilsjdbcTemplate
utils系列的代表有:

dbUtilsjdbcTemplate等;

下面对于这些框架做个简单概述:

至于 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 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs

MyBatis kann einfaches XML oder Anmerkungen zum Konfigurieren verwenden und native Informationen zuordnen, kombinieren Sie die Schnittstelle mit Javas MySQL数据库连接jar包。

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>x.x.x</version>
</dependency>
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.16</version>
</dependency>
Nach dem Login kopieren

创建一个表t_user(数据库也是肯定要自己创建的哈)

 CREATE TABLE `t_user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) DEFAULT NULL,
      `age` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Nach dem Login kopieren

插入一条数据:

INSERT INTO `t_user` VALUES ('1', 'tian', '19', '1');
Nach dem Login kopieren

创建该数据库表的实体类:

public class User {
    private Integer id;
    private String name;
    private Integer age;
    //set get
}
Nach dem Login kopieren

创建mapper配置文件:UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tian.mapper.UserMapper">
    <select id="selectUserById" resultType="com.tian.domain.User">
        select * from t_user where id = #{id}
    </select>
</mapper>
Nach dem Login kopieren

创建mapper接口:UserMapper.java

import com.tian.domain.User;

public interface UserMapper {
    User selectUserById(Integer id);
}
Nach dem Login kopieren

MyBatis 整体配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mblog?useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true&amp;useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mappers/UserMapper.xml"/>
    </mappers>
</configuration>
Nach dem Login kopieren

上面这些就是我们使用MyBatis基本开发代码。

下面我们来写一个测试类:

import com.tian.domain.User;
import com.tian.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MybatisApplication {

    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        InputStream inputStream = null;
        SqlSession sqlSession =null;
        try {
            //读取配置文件
            inputStream = Resources.getResourceAsStream(resource);
            //创建SqlSession工厂
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //创建sql操作会话
            sqlSession = sqlSessionFactory.openSession();
            UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
            //获取数据并解析成User对象
            User user = userMapper.selectUserById(1);
            //输出
            System.out.println(user);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //关闭相关资源
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            sqlSession.close();
        }
    }

}
Nach dem Login kopieren

测试结果:

User{id=1, name='tian', age=19}

如上面的代码所示,SqlSession是MyBatis中提供的与数据库交互的接口,SqlSession实例通过工厂模式创建。

为了创建SqlSession对象,首先需要创建SqlSessionFactory对象,而SqlSessionFactory对象的创建依赖于SqlSessionFactoryBuilder类,该类提供了一系列重载的build()方法,我们需要以主配置文件的输入流作为参数调用SqlSessionFactoryBuilder对象的bulid()方法,该方法返回一个SqlSessionFactory对象。

有了SqlSessionFactory对象的openSession()方法即可获取一个与数据库建立连接的SqlSession实例。SqlSessionFactory对象之后,调用SqlSessionFactory对象的openSession()方法即可获取一个与数据库建立连接的SqlSession实例。

前面我们定义了UserMapper接口,这里需要调用SqlSessiongetMapper()方法创建一个动态代理对象,然后调用UserMapper代理实例的方法即可完成与数据库的交互。

针对上面这个案例,我们来梳理一下MyBatis

前面我们定义了UserMapper接口,这里需要调用SqlSessiongetMapper()方法创建一个动态代理对象,然后调用UserMapper个案例我们来梳理一下MyBatis 核心组件

MyBatis 执行流程

Nachdem ich den MyBatis-Quellcode in einer Woche gelernt hatte, erhielt ich eine Zusammenfassung mit 10.000 Wörtern

🎜

Konfiguration

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用于描述Mapper中的SQL配置信息,是对Mapper XML配置文件中<select|update|delete|insert>等标签或者@Select/@Update等注解配置信息的封装。

SqlSession

SqlSession是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession

🎜🎜MappedStatement🎜🎜🎜🎜MappedStatement wird verwendet, um die SQL-Konfigurationsinformationen in Mapper zu beschreiben. Es ist ein Paar von Mapper XMLIn der Konfigurationsdatei<select|update|delete|insert> und andere Tags oder @Select/@Update und andere Kapselung von Anmerkungskonfigurationsinformationen. 🎜🎜🎜🎜SqlSession🎜🎜🎜🎜 Executor

Executor是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。

StatementHandler

StatementHandler封装了对JDBC Statement对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。

ParameterHandler

MyBatis框架使用的Statement类型为CallableStatementPreparedStatement时,ParameterHandler用于为Statement对象参数占位符设置值。

ResultSetHandler

ResultSetHandler

🎜🎜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类型调用PreparedStatementCallableStatement对象对应的setXXX()方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()获取SQL执行结果。

使用JDBC API

Verwenden Sie
  • PreparedStatement interface Eine Reihe von PreparedStatement接口中提供的一系列的setXXX()方法,将Java类型转换为对应的JDBC类型并为参数占位符赋值。
  • 执行SQL语句获取ResultSet对象后,需要调用ResultSet对象的getXXX()方法获取字段值,此时会将JDBC类型转换为Java类型。
  • MyBatis提供的TypeHandler及与Java类型和JDBC类型之间的对应关系:

    Nachdem ich den MyBatis-Quellcode in einer Woche gelernt hatte, erhielt ich eine Zusammenfassung mit 10.000 Wörtern

    小结

    我们使用到了SqlSession组件,它是用户层面的API。实际上SqlSession是Executor组件的外观,目的是为用户提供更友好的数据库操作接口,这是设计模式中外观模式的典型应用。

    真正执行SQL操作的是Executor组件,Executor可以理解为SQL执行器,它会使用StatementHandler

    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 : 🎜

    Nachdem ich den MyBatis-Quellcode in einer Woche gelernt hatte, erhielt ich eine Zusammenfassung mit 10.000 Wörtern🎜 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. CallableStatementPreparedStatement时,会通过ParameterHandler组件为参数占位符赋值。ParameterHandler组件中会根据Java类型找到对应的TypeHandler对象,TypeHandler中会通过Statement对象提供的setXXX()方法(例如setString()方法)为Statement对象中的参数占位符设置值。

    StatementHandler组件使用JDBC中的Statement对象与数据库完成交互后,当SQL语句类型为SELECT时,MyBatis通过ResultSetHandler

    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 SimpleExecutorReuseExecutorBatchExecutor。这些类都继承自BaseExecutor,在BaseExecutor类的query()方法中,首先从缓存中获取查询结果,如果获取不到,则从数据库中查询结果,然后将查询结果缓存起来。而MyBatis的二级缓存则是通过装饰器模式实现的,当通过cacheEnabled参数开启了二级缓存,MyBatis框架会使用CachingExecutor对SimpleExecutorReuseExecutor或者BatchExecutor进行装饰,当执行查询操作时,对查询结果进行缓存,执行更新操作时则更新二级缓存。本章最后介绍了MyBatis如何整合Redis作为二级缓存。

    除此之外,MyBatis还支持EhcacheOSCache

    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 ExecutorParameterHandlerResultSetHandlerStatementHandlervier 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.

    Nachdem ich den MyBatis-Quellcode in einer Woche gelernt hatte, erhielt ich eine Zusammenfassung mit 10.000 Wörtern

    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: <if&gt ;, <foreach>Warte. <where><if><choose|when|otherwise><foreach>等。

    在MyBatis源码中有个SqlSource对象会作为MappedStatement对象的属性保存在MappedStatement对象中。执行Mapper时,会根据传入的参数信息调用SqlSource对象的getBoundSql()方法获取BoundSql对象,这个过程就完成了将SqlNode对象转换为SQL语句的过程。

    比如:,#{}

    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!

    Verwandte Etiketten:
    Quelle:Java后端技术全栈
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage