Maison  >  Article  >  Java  >  Après avoir appris le code source de MyBatis en une semaine, j'ai obtenu un résumé de 10 000 mots

Après avoir appris le code source de MyBatis en une semaine, j'ai obtenu un résumé de 10 000 mots

Java后端技术全栈
Java后端技术全栈avant
2023-08-23 14:51:141217parcourir

Comme nous le savons tous, 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"));
        }
    }
}

说明:

数据库驱动:

Class.forName("com.mysql.jdbc.Driver");

获取连接:

Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);

创建Statement或者PreparedStatementOui

JDBC🎜 est un produit encapsulé, donc avant de parler du code source de MyBatis, il faut d'abord le comprendre🎜JDBC🎜. 🎜🎜

🎜JDCB🎜 🎜

Cas JDBC : 🎜

Statement stmt = conn.createStatement();

Description : 🎜

Pilote de base de données : 🎜

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

Obtenir le lien :🎜

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

CréerDéclarationou PreparedStatementObjet : 🎜

Statement stmt = conn.createStatement();

执行sql数据库查询:

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

解析结果集:

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

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

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

传统JDBC的问题

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

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

持久化框

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

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

dbUtilsjdbcTemplate等;

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

至于 jpa,它只是一个规范标准,并非具体框架,不等同于spring-data-jpa现框架,当然其他还有eclipseLink,topLink。

MyBatis 的特点Il s'agit d'une application SQL et d'une application SQL. Il s'agit d'une application SQL. spring-data-jpa(hibernate) pour les applications SQL, pour les applications SQL et pour les applications SQL复杂。 以上就可以根据实际的业务进度和业务支撑情况做出选择了。

MyBatis其实可以在一个项目在Il s'agit de MyBatis et spring-data-jpa, et de SQL mybatis, ainsi que de Spring-data-jpa de SQL.

🎜🎜鉴于前实际开发中使用数量,我们选择🎜 进行分析。🎜

mybatis

Les amis qui débutent dans le développement ne connaissent peut-être pas le prédécesseur de MyBatis. Avant 2010, ils ne soumettaient pas MyBatis, appelé ibatis. MyBatis ,叫ibatis

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

MyBatis est un excellent persistant en couches A framework qui prend en charge le SQL personnalisé, les procédures stockées et le mappage avancé. MyBatis évite presque tout le code JDBC, le réglage manuel des paramètres et la récupération des jeux de résultats. MyBatis peut utiliser du XML simple ou des annotations pour configurer et cartographiez les informations natives, combinez l'interface avec le POJOs (Plain Ordinary Java Object, objet Java ordinaire) est mappé dans un enregistrement de la base de données. 🎜<h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 18px;"> <span style="display: none;"></span>特点<span style="display: none;"></span> </h4> <ul class="list-paddingleft-2" data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;"> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">灵活:MyBatis 不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求。</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">提供映射标签,支持对象与数据库的orm字段关系映射</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">提供对象关系映射标签,支持对象关系组建维护</section></li> <li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);">提供xml标签,支持编写动态sql。</section></li> </ul> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 18px;"> <span style="display: none;"></span>案例<span style="display: none;"></span> </h4> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;margin-top: 1px;margin-bottom: 1px;">需要来源两个jar包:<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);'>MyBatis的jar包和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>

创建一个表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;

插入一条数据:

INSERT INTO `t_user` VALUES (&#39;1&#39;, &#39;tian&#39;, &#39;19&#39;, &#39;1&#39;);

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

public class User {
    private Integer id;
    private String name;
    private Integer age;
    //set get
}

创建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>

创建mapper接口:UserMapper.java

import com.tian.domain.User;

public interface UserMapper {
    User selectUserById(Integer id);
}

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>

上面这些就是我们使用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();
        }
    }

}

测试结果:

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 核心 组件

mybatis 执行 流程

Après avoir appris le code source de MyBatis en une semaine, j'ai obtenu un résumé de 10 000 mots

🎜

Configuration

est utilisé pour décrire Les principales informations de configuration de MyBatis. Lorsque d'autres composants ont besoin d'obtenir les informations de configuration, ils peuvent transmettre directement Configuration acquisition d'objet. De plus, MyBatis utilisera les informations de configuration du Mapper, tapez alias, TypeHandler et ainsi de suite sont enregistrés dans Configuration, lorsque d'autres composants ont besoin de ces informations, ils peuvent également utiliser Objet Configuration. MyBatis的主配置信息,其他组件需要获取配置信息时,直接通过Configuration对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler等注册到Configuration组件中,其他组件需要这些信息时,也可以从Configuration对象中获取。

MappedStatement

MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML配置文件中b5d5a6a8d1a81baf21ea188537c0af35等标签或者@Select/@Update等注解配置信息的封装。

SqlSession

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

🎜🎜MappedStatement🎜🎜🎜🎜MappedStatement est utilisé pour décrire les informations de configuration SQL dans Mapper. Il s'agit d'une paire de Mapper XMLDans le fichier de configurationb5d5a6a8d1a81baf21ea188537c0af35 et autres balises ou @Select/@Update et encapsulation d'autres informations de configuration d'annotation. 🎜🎜🎜🎜SqlSession🎜🎜🎜🎜SqlSession est une API orientée utilisateur fournie par MyBatis, qui représente l'objet de session lors de l'interaction avec la base de données et est utilisée pour compléter les fonctions d'ajout, de suppression, de modification et de requête de la base de données. SqlSession est l'apparence du composant Executor, le but est de fournir une interface d'exploitation de base de données facile à comprendre et à utiliser. 🎜

Executor

Executor C'est l'exécuteur SQL de MyBatis. Toutes les opérations d'ajout, de suppression, de modification et d'interrogation de la base de données dans MyBatis sont réalisées par le composant Executor. Executor是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。

StatementHandler

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

ParameterHandler

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

ResultSetHandler

ResultSetHandler

🎜🎜StatementHandler🎜🎜🎜🎜StatementHandlerEncapsule la paireJDBC Statement opérations sur les objets, comme définir les paramètres de l'objet Statement, appeler les méthodes fournies par l'interface Statement pour interagir avec la base de données, etc. 🎜🎜🎜🎜ParameterHandler🎜🎜🎜🎜QuandMyBatis code>Le type de déclaration utilisé par le framework est <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) ; famille de polices : " operator mono consolas monaco menlo monospace saut de mot break-all couleur rgb>CallableStatement code> et<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 ); famille de polices : " operator mono consolas monaco menlo monospace break-all rgb>PreparedStatement, ParameterHandler est utilisé pour définir les valeurs des espaces réservés pour les paramètres de l'objet Statement . 🎜🎜🎜🎜ResultSetHandler🎜🎜🎜🎜ResultSetHandlerEncapsule le fonctionnement des objets ResultSet dans JDBC Lors de l'exécution d'une instruction SELECT de type SQL, ResultSetHandler est utilisé pour convertir les résultats de la requête en objets Java. 🎜

TypeHandler

TypeHandler Il s'agit d'un processeur de types dans MyBatis, utilisé pour gérer le mappage entre les types Java et les types JDBC. Sa fonction se reflète principalement dans la possibilité d'appeler PreparedStatement ou <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);famille de polices : " operator mono consolas monaco menlo monospace de mot break-all rgb>CallableStatement objet correspondant setXXX() définit la valeur pour l'objet Statement. Et peut appeler le getXXX() Récupérez les résultats de l'exécution SQL. TypeHandler是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatementCallableStatement对象对应的setXXX()方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()获取SQL执行结果。

使用JDBC API

Utilisez API JDBCDévelopper des applications, One L'un des aspects les plus fastidieux consiste à gérer la conversion entre les types JDBC et les types Java. Les deux situations impliquant la conversion du type Java et du type JDBC sont les suivantes : 🎜
  • PreparedStatement l'objet est un espace réservé de paramètre Lors de la définition de la valeur du symbole, vous devez appeler PreparedStatement interface Une série de setXXX() code> Méthode, convertissez les types Java en types JDBC correspondants et attribuez des valeurs aux espaces réservés des paramètres.
  • PreparedStatement对象为参数占位符设置值时,需要调用PreparedStatement接口中提供的一系列的setXXX()方法,将Java类型转换为对应的JDBC类型并为参数占位符赋值。
  • 执行SQL语句获取ResultSet对象后,需要调用ResultSet对象的getXXX()方法获取字段值,此时会将JDBC类型转换为Java类型。
  • MyBatis提供的TypeHandler及与Java类型和JDBC类型之间的对应关系:

    Après avoir appris le code source de MyBatis en une semaine, j'ai obtenu un résumé de 10 000 mots

    小结

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

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

    Exécutez l'instruction SQL pour obtenir ResultSet, vous devez appeler l'objet getXXX() obtient la valeur du champ, et à ce moment le type JDBC sera converti en type Java.

    MyBatis Fourni TypeHandler et types Java et correspondance JDBC entre les types : 🎜

    Après avoir appris le code source de MyBatis en une semaine, j'ai obtenu un résumé de 10 000 mots🎜 figure>

    Résumé

    Nous avons utilisé SqlSession, qui est une API au niveau utilisateur. En faitSqlSession est l'apparence du composant Executor L'objectif est de fournir aux utilisateurs une interface d'exploitation de base de données plus conviviale, qui est une application typique du modèle d'apparence dans les modèles de conception. 🎜

    Exécuter réellement SQL Le L'opération est le composant Executor. Executor peut être compris comme un exécuteur SQL. Il utilisera Le composant StatementHandler fonctionne sur l'objet Statement JDBC. 🎜

    Lorsque le type de déclaration est CallableStatement et PreparedStatement, le paramètre sera occupé par le ParameterHandler affectation des caractères des composants. ParameterHandler trouvera celui correspondant en fonction le type Java TypeHandler, TypeHandler passera taille de l'objet : 14 px ; remplissage : 2 px 4 px ; rayon de bordure : 4 px ; marge droite : 2 px ; marge gauche : 2 px ; couleur d'arrière-plan : rgba (27, 31, 35, 0,05); famille de polices : " Operator Mono ", Consolas, Monaco, Menlo, monospace; word-break: break-all; color: rgb(239, 112, 96);">setXXX() (telle que la méthode setString()) est dans la valeur de paramètre d’espace réservé du paramètre de l’objet Statement. CallableStatementPreparedStatement时,会通过ParameterHandler组件为参数占位符赋值。ParameterHandler组件中会根据Java类型找到对应的TypeHandler对象,TypeHandler中会通过Statement对象提供的setXXX()方法(例如setString()方法)为Statement对象中的参数占位符设置值。

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

    Le composant StatementHandler utilise l'instruction dans JDBC après l'objet termine l'interaction avec la base de données, lorsque le type d'instruction SQL est SELECT, MyBatis passe ResultSetHandler obtient l'objet ResultSet à partir de l'objet Statement, puis convertit l'objet ResultSet en un objet Java.

    Compétences avancées

    Modèles de conception

    Les modèles de conception sont largement utilisés dans MyBatis, nous pouvons apprendre plusieurs modèles de conception :🎜."Modèle d'usine"
    • Mode Décorateur
    • Modèle de chaîne de responsabilité
    • ....
    • Caching
    • Dans les applications Web, la mise en cache est un composant essentiel. Nous utilisons généralement un middleware de mise en cache tel que Redis ou Memcached pour intercepter un grand nombre de requêtes vers la base de données et réduire la pression sur la base de données. En tant que composant important, MyBatis fournit bien entendu également un support correspondant en interne. En ajoutant des fonctions de mise en cache au niveau du framework, la pression sur la base de données peut être réduite et la vitesse des requêtes peut être améliorée en même temps. On peut dire que cela fait d'une pierre deux coups.
    • La structure du cache MyBatis est composée de
      Les deux niveaux de cache sont des classes d'implémentation utilisant l'interface Cache. Par conséquent, dans les chapitres suivants, je vais d'abord vous présenter le code source de plusieurs classes d'implémentation de Cache, puis analyser l'implémentation du cache de premier et de deuxième niveau.
    • Utilisation du cache de premier niveau et du cache de deuxième niveau MyBatis : le cache de premier niveau MyBatis est un cache de niveau SqlSession, qui est activé par défaut et ne peut pas être désactivé ; la valeur du paramètre cacheEnabled dans le fichier de configuration principal MyBatis.
    • Le cache de premier niveau est implémenté dans Executor. Le composant Executor de MyBatis a 3 implémentations différentes, à savoir SimpleExecutor code>, <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 break-all rgb>ReuseExecutor et BatchExecutor. Ces classes héritent toutes de , 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">BaseExecutor code>, dans BaseExecutor Dans la méthode query() de la classe, les résultats de la requête sont d'abord obtenus à partir du cache. Si les résultats ne peuvent pas être obtenus, les résultats sont récupérés de la base de données, puis les résultats de la requête sont mis en cache. Le cache de deuxième niveau de MyBatis est implémenté via le mode décorateur. Lorsque le cache de deuxième niveau est activé via le paramètre cacheEnabled, le framework MyBatis utilisera CachingExecutor pour SimpleExecutor, ReuseExecutorou BatchExecutor est décoré. Lorsqu'une opération de requête est effectuée, les résultats de la requête sont mis en cache et lorsqu'une opération de mise à jour est effectuée, le cache secondaire est mis à jour. Ce chapitre présente enfin MyBatisComment intégrer Redis comme cache de niveau 2. SimpleExecutorReuseExecutorBatchExecutor。这些类都继承自BaseExecutor,在BaseExecutor类的query()方法中,首先从缓存中获取查询结果,如果获取不到,则从数据库中查询结果,然后将查询结果缓存起来。而MyBatis的二级缓存则是通过装饰器模式实现的,当通过cacheEnabled参数开启了二级缓存,MyBatis框架会使用CachingExecutor对SimpleExecutorReuseExecutor或者BatchExecutor进行装饰,当执行查询操作时,对查询结果进行缓存,执行更新操作时则更新二级缓存。本章最后介绍了MyBatis如何整合Redis作为二级缓存。

      除此之外,MyBatis还支持EhcacheOSCache

      De plus, MyBatis prend également en charge Ehcache code> 、<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 break-all rgb>OSCache, etc., cette fonctionnalité n'est pas couramment utilisé.

      Plug-ins

      La plupart des frameworks prennent en charge les plug-ins. Les utilisateurs peuvent étendre leurs fonctions en écrivant des plug-ins, et Mybatis ne fait pas exception.

      MyBatis fournit un mécanisme d'extension qui peut modifier le comportement d'exécution de SQL lors de l'exécution de Mapper. Ce mécanisme d'extension est implémenté via des intercepteurs, et les intercepteurs définis par l'utilisateur sont également appelés plug-ins MyBatis. 🎜Le framework

      MyBatis prend en charge l'interception de ExecutorParameterHandlerResultSetHandlerStatementHandlerquatre méthodes de composants. Maîtrisez le principe d'implémentation du plug-in MyBatis, puis implémentez un plug-in de requête de pagination et un plug-in de statistiques SQL lent. Lorsque les fonctions dont nous avons besoin ne peuvent pas être satisfaites par le framework MyBatis, nous pouvons envisager de les implémenter via un plug-in personnalisé. -ins.

      Implémentation classique : PageHelper.

      Log

      MyBatis fournit les implémentations correspondantes de l'interface Log pour différents frameworks de journalisation La classe d'implémentation de l'interface Log est illustrée dans la figure ci-dessous. Comme le montre la classe d'implémentation, MyBatis prend en charge 7 implémentations de journaux différentes, comme détaillé ci-dessous.

      Après avoir appris le code source de MyBatis en une semaine, j'ai obtenu un résumé de 10 000 mots

      Ce qui suit est une brève explication de certains d'entre eux couramment utilisés :

      • Journalisation Apache Commons : utilisez JCL pour générer des journaux.
      • Log4j 2 : utilisez le framework Log4j 2 pour saisir les journaux.
      • Java Util Logging : utilisez le module de journalisation intégré du JDK pour générer des journaux.
      • Log4j : utilisez le framework Log4j pour générer des journaux.
      • Pas de journalisation : aucun journal n'est généré.
      • SLF4J : utilisez la façade de journaux SLF4J pour générer des journaux.
      • Stdout : Sortie des journaux vers le périphérique de sortie standard (tel que la console).

      L'ordre dans lequel MyBatis recherche les frameworks de journalisation est

      SLF4J→JCL→Log4j2→Log4j→JUL→No Logging.

      S'il n'y a pas de cadre de journalisation sous Classpath, la classe d'implémentation de journal NoLoggingImpl est utilisée, c'est-à-dire qu'aucun journal n'est généré.

      Liaison SQL dynamique

      Le SQL dynamique fait référence au fait que les conditions spécifiques ne peuvent pas être prédites à l'avance et que les instructions SQL doivent être générées dynamiquement en fonction de la situation spécifique au moment de l'exécution.

      Il existe de riches balises SQL dynamiques dans MyBatis, telles que : 196185dae55b7edbe154a5051db664a7, b3b27364927cc426e9d39ba8f3b457aeAttendez. 196185dae55b7edbe154a5051db664a7f3bf5eff46860b27119c8dd4e92f1e577c3646f85db7ce074bf2e07d38d2c6e1800a174bf160103126f2a6097b3e44a4等。

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

      比如:,#{}

      Dans le code source MyBatis, il existe un objet SqlSource qui sera enregistré dans l'objet MappedStatement en tant que propriété de l'objet MappedStatement. Lorsque Mapper est exécuté, la méthode getBoundSql() de l'objet SqlSource est appelée en fonction des informations de paramètre entrantes pour obtenir l'objet BoundSql. Ce processus termine le processus de conversion de l'objet SqlNode en instruction SQL.

      Par exemple :, #{} L'espace réservé du compte sera remplacé par "?", puis la méthode setXXX() de l'objet PreparedStatement dans JDBC est appelée pour définir la valeur de l'espace réservé du paramètre, et l'espace réservé ${} sera directement remplacé par le texte du paramètre transmis. contenu. Résumé

    Cet article est l'expérience globale de l'analyse du code source MyBatis. J'espère qu'il vous sera utile. 🎜🎜🎜

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer