MyBatis的工作原理

Mybatis运行原理(我保证全宇宙最详细) 最近几天通过看源码来研究了一下mybatis的运行步骤,本篇文章以最基础的mybatis利用sqlSession操作数据库来讲解。我相信只要各位跟着我的节奏看完这篇文章就会对mybatis的运行步骤有个大体的认识(希望大家像我一样编写一个简单例子,然后跟着我的步骤看源码,不明白的地方debug)。这篇绝对是全网最详细的介绍mybatis运行原理的文章,当然如果你没有耐心看完的话,我也没任何办法,毕竟研究源码是一种枯燥的行为。如果你真的想去了解mybatis背后是怎么运行的,我相信这篇文章肯定会帮助到你。 阅读详情
AI摘要

MyBatis是流行的Java持久层框架,用于处理数据库交互。本文介绍其核心组件,如SqlSessionFactory、SqlSession等;阐述初始化与配置加载过程;还讲解了SqlSession、Mapper等工作原理,以及缓存机制、动态SQL和插件机制,能助开发者编写高效持久层代码。

​执行流程

MyBatis 是一个流行的持久层框架,主要用于在 Java 应用程序中处理数据库交互。与传统的 JDBC 不同,MyBatis 提供了更高层次的抽象,通过映射文件或注解方式将 SQL 语句和 Java 对象关联起来,简化了数据库操作。MyBatis 不是一个全功能的 ORM(Object-Relational Mapping)框架,但它在保持 SQL 控制的同时,提供了方便的结果映射和参数处理功能。

一、MyBatis 的核心组件

MyBatis 的工作原理可以通过其核心组件来理解,这些组件包括:

  1. SqlSessionFactory:用于创建 SqlSession 实例的工厂。SqlSession 是 MyBatis 执行持久化操作的主要接口。
  2. SqlSession:MyBatis 的主要操作接口,通过它可以执行 SQL 语句、获取映射器(Mapper)实例、管理事务等。
  3. Mapper:映射器接口,用于定义数据库操作方法。MyBatis 通过动态代理技术,将 SQL 映射到这些接口的方法上。
  4. Configuration:配置类,保存 MyBatis 的配置信息,包括映射文件、数据源、环境设置等。
  5. MappedStatement:封装了一条 SQL 语句的所有信息,包括 SQL 字符串、输入参数、输出结果类型等。
  6. Executor:执行器,用于执行 SQL 语句并返回结果,是 MyBatis 的底层引擎。
  7. Cache:缓存组件,用于缓存查询结果,提升性能。

二、MyBatis 的初始化与配置加载

  1. 加载配置文件:MyBatis 初始化的第一步是加载配置文件(mybatis-config.xml)。这个文件包含了 MyBatis 的全局配置,包括环境配置(如数据源、事务管理器)、别名设置、插件、缓存等配置。

  2. 构建 SqlSessionFactory:通过读取配置文件,MyBatis 会构建 SqlSessionFactory 对象。SqlSessionFactory 是一个重量级对象,通常在应用启动时创建一次,并在应用的整个生命周期中共享。

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  1. 解析映射文件:在配置文件中,还会指定映射文件的位置,这些映射文件(Mapper 文件)定义了 SQL 语句与 Java 对象之间的映射关系。MyBatis 在初始化时会解析这些映射文件,将其转换为 MappedStatement 对象存储在 Configuration 中。

三、SqlSession 的工作原理

SqlSession 是 MyBatis 执行数据库操作的核心接口,通常由 SqlSessionFactory 创建。它提供了多种方法来执行 SQL 语句,例如 selectOne、selectList、insert、update、delete 等。SqlSession 的生命周期较短,通常在每次数据库操作时创建,操作完成后即关闭。

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUserById(1);
}
  1. 获取 Mapper 接口:通过 SqlSession.getMapper(Class<T> type) 方法,MyBatis 会返回一个映射器接口的代理对象。这个代理对象负责将接口方法调用转发到具体的 SQL 执行逻辑上。

  2. 执行 SQL 语句:当调用 Mapper 接口的方法时,代理对象会根据方法的签名找到对应的 MappedStatement 对象,构建 SQL 语句并执行。

  3. 管理事务:SqlSession 还负责事务的管理,开发者可以显式地调用 commit 或 rollback 方法,或者在自动提交模式下自动管理事务。

  4. 关闭资源:SqlSession 的使用遵循“打开-操作-关闭”的模式,使用完毕后,必须显式关闭以释放数据库连接等资源。

四、Mapper 的工作原理

MyBatis 通过 Mapper 接口来实现 SQL 的调用。Mapper 接口中的每个方法都对应一个 SQL 语句。MyBatis 使用动态代理模式在运行时生成 Mapper 接口的实现类,当调用接口方法时,MyBatis 会拦截该调用,并将其映射到相应的 SQL 语句。

public interface UserMapper {
    User selectUserById(int id);
}
  1. 方法签名与 SQL 映射:Mapper 接口的方法通过方法签名(方法名和参数)与映射文件中的 SQL 语句关联。MyBatis 会根据方法名匹配映射文件中的 id,找到对应的 SQL 语句进行执行。

  2. 参数绑定与结果映射:在执行 SQL 语句时,MyBatis 会自动绑定方法参数到 SQL 语句的参数占位符上,并根据结果映射(ResultMap)将查询结果转换为相应的 Java 对象。

五、Executor 和 MappedStatement 的工作原理

  1. MappedStatement:这是 MyBatis 中最重要的配置对象之一,它包含了 SQL 语句的所有信息,如 SQL 字符串、输入参数类型、输出结果类型、缓存配置等。当 Mapper 方法被调用时,MyBatis 会从 Configuration 中获取对应的 MappedStatement,然后通过 Executor 来执行这个语句。

  2. Executor:Executor 是 MyBatis 执行 SQL 语句的核心组件。它负责与数据库通信,执行 SQL,并返回结果。Executor 有多种实现,常见的有 SimpleExecutor、ReuseExecutor 和 BatchExecutor。

    • SimpleExecutor:每次执行 SQL 语句时都会创建新的 Statement 对象。
    • ReuseExecutor:执行 SQL 语句时会复用 Statement 对象,提高性能。
    • BatchExecutor:支持批处理操作,将多条 SQL 语句批量执行,以减少数据库通信的次数。
  3. 执行流程:

    • Executor 首先会检查是否有缓存命中(一级缓存或二级缓存),如果缓存命中,则直接返回缓存结果。
    • 如果缓存未命中,Executor 会通过 MappedStatement 中的 SQL 语句和参数,构建真正的 SQL 语句,并通过 JDBC API 执行。
    • 执行结果将被封装为相应的 Java 对象,并存储在缓存中(如果启用了缓存)。

六、缓存机制

MyBatis 提供了两级缓存机制,以提高查询性能:

  1. 一级缓存:SqlSession 级别的缓存。默认开启且无法禁用,它缓存了相同 SqlSession 下执行的相同 SQL 语句的查询结果。当一个 SqlSession 被关闭后,其一级缓存也被清空。

  2. 二级缓存:Mapper 级别的缓存。可以通过配置开启,二级缓存可以跨 SqlSession 共享。MyBatis 的二级缓存可以使用多种实现(如 Ehcache、Redis 等),并且可以通过 Cache 接口进行自定义。

<cache/>

通过在映射文件中配置 <cache/> 标签,可以为该 Mapper 开启二级缓存。

七、动态 SQL

MyBatis 支持动态生成 SQL 语句,允许开发者根据不同的条件动态调整 SQL 的结构。动态 SQL 是 MyBatis 的一大特点,主要通过在 XML 映射文件中使用 <if>、<choose>、<where>、<set> 等标签来实现。

<select id="findActiveUsers" resultType="User">
    SELECT * FROM users
    <where>
        <if test="username != null">
            AND username = #{username}
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
        <if test="active == true">
            AND active = 1
        </if>
    </where>
</select>

八、插件机制

MyBatis 提供了插件机制,允许开发者在 SQL 语句的执行过程中的各个环节进行拦截和增强。插件可以用于实现自定义的逻辑,如 SQL 语句的日志记录、性能监控、参数加密等。

插件通过实现 Interceptor 接口,并使用 @Intercepts 注解来定义拦截点。MyBatis 支持对 Executor、StatementHandler、ParameterHandler、ResultSetHandler 四个核心对象的拦截。

@Intercepts({
    @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
public class ExamplePlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 在这里添加自定义逻辑
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object

 target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        // 设置插件的属性
    }
}

九、总结

MyBatis 是一个功能强大的持久层框架,通过对 SQL 语句的精确控制和方便的映射配置,提供了一种灵活且高效的数据库访问方式。MyBatis 的工作原理主要围绕 SqlSessionFactory、SqlSession、Mapper、Executor、MappedStatement 这几个核心组件展开,通过配置文件和映射文件,将 Java 对象和数据库表有效地连接起来。

MyBatis 通过动态代理、缓存机制、动态 SQL、插件机制等特性,极大地提升了数据库操作的简洁性和可维护性,同时保留了对 SQL 语句的完全控制权,适合于各种需要精细化控制 SQL 的场景。理解 MyBatis 的工作原理,有助于开发者更好地使用这个工具,编写高效、可维护的持久层代码。

​

深入详解Mybatis的架构原理与6大核心流程 MyBatis 是 Java 生态中非常著名的一款 ORM 框架,目前在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。 如果你想要进入一线大厂,能够熟练使用 MyBatis 开发已经是一项非常基本的技能,同时大厂也更希望自己的开发人员深入了解 MyBatis 框架的原理和核心实现。 从这个角度看,理解 MyBatis 原理,阅读 MyBatis核心源码,这样更有利于提高职场竞争力。 在深入了解Mybatis的源码之前,我们先了解一下Mybatis的整体架构和工作原理,这样有助于我们在阅读. 阅读详情

相关推荐

Mybatis简介与原理详解

XML方式是最常用的方式,它将SQL语句存储在独立的XML文件中,并通过命名空间和ID来标识每个SQL语句。MyBatis是一种Java持久化框架,它通过将SQL语句与Java代码进行映射,提供了一种简单、直观的方法来访问关系型数据库。MyBatis的配置文件是用于配置和管理MyBatis的核心组件的。这些信息将被用于建立与数据库的连接。通过对数据库配置、SQL映射、数据库操作和配置文件的详细解释,我们可以更好地理解和应用MyBatis框架。最后,我们可以编写一个简单的测试代码来验证MyBatis的使用。

CodeGu的博客 530

Mybatis 工作原理详解

mybatis:缓存、防止注入、标签使用,结果集封装从底层实现

huangtenglong的博客 6201

5分钟搞定!用扣子空间LinkReaderPlugin快速搭建网页内容抓取机器人(附Python复现代码)

本文详细介绍了如何利用扣子空间的LinkReaderPlugin快速搭建网页内容抓取机器人,仅需5分钟即可完成配置。通过Python复现代码和可视化工作流,开发者可以轻松实现智能网页抓取,提升数据采集效率。文章还探讨了与RAG工作流的集成方案及性能优化技巧,适用于金融监控、电商追踪等多种场景。

study的专栏 1093

MyBatis基本工作原理介绍

1、MyBatis基本工作原理介绍 计算机的基本工作就是存储和计算,而MyBatis是存储领域的利器。MyBatis的基本工作原理就是:先封装SQL,接着调用JDBC操作数据库,最后把数据库返回的表结果封装成Java类。 2、MyBatis的核心流程介绍 mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件中构建出SqlSessionFactory,然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过

weixin_44431073的博客 2万+

LoRa项目实战:手把手教你为ESP32选配和焊接天线(从PCB到信号测试)

本文详细介绍了为ESP32选配和焊接LoRa天线的全流程,包括天线选型、PCB布局设计、焊接工艺及信号测试。重点解析了PCB板载天线、导线天线和陶瓷贴片天线的适用场景与性能特点,并提供专业的焊接技巧和信号测试方案,帮助开发者优化LoRa模块的无线通信性能。

weixin_30470643的博客 394

机器学习之支持向量机SVM及代码示例

一、线性可分SVMSVM算法最初是用来处理二分类问题的,是一种有监督学习的分类算法。对于线性可分的二分类问题,我们可以找到无穷多个超平面,将两类样本进行区分。(超平面:一维中是一个点;二维中是一条线;三维中是一个面……)在上面的多个超平面中,它们都可以成功将样本集划分两边,但哪一个超平面更好?一般来说,当样本点离超平面越近,样本的标签为某类型的概率应该为0.5左右,确信度比较低,而样本点离超平面越远

cxmscb的博客 5万+

Mybatis 的工作原理及流程

MyBatis的底层操作封装了JDBC的API,MyBatis的工作原理以及核心流程与JDBC的使用步骤一脉相承,MyBatis的核心对象(SqlSession,Executor)与JDBC的核心对象(Connection,Statement)相互对应。本文的核心观点是:从JDBC入手并立足于JDBC,才能深入的理解MyBatis的工作原理以及核心流程。

qq_52252193的博客 3552

保姆级教程:手把手教你给联想System x 3650 M5服务器配置RAID 5并U盘装系统

本文提供联想System x 3650 M5服务器配置RAID 5并U盘安装系统的详细教程,特别适合零基础运维人员。从准备工作、RAID 5配置到U盘引导和系统安装,涵盖全流程关键步骤与常见问题解决方案,帮助用户高效完成服务器部署。

weixin_42535703的博客 358

MyBatis 的工作原理解析

本文记录 Mybatis 的工作原理解析,做到知识梳理总结的作用。

m0_49692893的博客 3598

微信小程序 - 完美解决“code“:“NO_AUTH“,“message“:“商户号该产品权限未开通,请前往商户平台>产品中心检查后重试“(微信小程序报错问题排查解决)

微信小程序NO_AUTH: 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试?微信小程序提示商户号该产品权限未开通,请前往商户平台>产品中心检查后重试,微信小程序"code":"NO_AUTH"错误码怎么解决,报错信息如下:httpResponseBody[{"code":"NO_AUTH","message":"商户号该产品权限未开通,请前往商户平台>产品中心检查后重试"}],微信小程序支付问题,如何解决这个问题,虚拟支付商户号,虚拟支付商户号里面没有产品支付的页面,排查商户号没问题,商户号配置

🏆 前端领域优质创作者 4445

Day 01: 与Python的第一次亲密接触

环境搭建 、第一个程序 Hello, World!、以及Python之禅 (The Zen of Python) 的解读。

杨小扩的博客 220

了解Mybatis的工作原理吗

来源:cnblogs.com/scuury/p/10371246.html 推荐阅读 1.SpringBoot 整合篇 2.手写一套迷你版HTTP服务器 3.记住:永远不要在MySQL中使用UTF-8 4.Springboot启动原理解析 近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了。...

Java笔记虾 1239

【UML】第12篇 序列图(1/2)——基本概念和构成

序列图(Sequence Diagram)是一种用于显示对象之间交互的图形化表示。它描述了在特定场景下,对象之间按照时间顺序进行的消息传递和协作过程。在序列图中,对象被表示为带有垂直虚线的矩形,虚线表示对象的生命周期。对象之间的交互通过箭头表示的消息来表示,箭头从一个对象的生命线指向另一个对象的生命线,表示消息的发送和接收。

AI人人懂 3051

说说mybatis的工作原理

MyBatis 会解析 SQL 映射文件,执行对应的 SQL 语句,并将结果映射到 Java 对象。你需要创建一个 Java 接口,接口中声明了数据库操作的方法,然后创建对应的 XML 映射文件,将 SQL 语句与接口方法进行关联。它的优点之一是提供了灵活的 SQL 映射和参数处理方式,使得开发人员可以更好地控制 SQL 语句和 Java 对象之间的映射关系。MyBatis 是一个持久层框架,它的工作原理涉及到配置文件、SQL 映射文件、Java 对象和数据库的交互。这是一个典型的 SQL 注入攻击。

tanwu1的博客 171

GPU硬件架构与微架构深度解析34-GPU安全架构深度解析

现代GPU不仅是图形处理器,更是高性能计算平台,安全架构设计至关重要。内存加密- 保护数据在传输和存储时的安全安全启动- 确保固件和软件的完整性隔离机制- 防止不同应用间的数据泄露密钥管理- 安全存储和处理加密密钥。

2301_79143213的博客 101

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Mybatis的工作原理

1、工作原理 读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。 **加载映射文件。**映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。 **构造会话工厂:**通过 MyBatis 的环境..

Mark 9764

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

能说说MyBatis的工作原理吗?

能说说MyBatis的工作原理吗?

java1234的博客 1610

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MyBatis的工作原理和应用实例

MyBatis 是一个优秀的持久层框架,它封装了 JDBC 的底层操作,MyBatis 通过其灵活的配置和强大的映射能力,大大简化了数据库操作,同时保留了 SQL 的灵活性和可控性,是 Java 项目中常用的持久层解决方案。

weixin_46455584的博客 1241

详解关于mybatis工作原理以及优缺点

(3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。‌3️⃣简化JDBC操作‌:MyBatis封装了大部分JDBC代码,减少了设置参数、获取结果集等重复性工作,简化了异常处理,减少了潜在的内存泄漏风险‌。‌2️⃣高性能‌:MyBatis提供了高效的缓存机制,能够减少数据库操作的次数,支持批量操作和分页查询等功能,从而提高应用程序的性能‌。2. 然后,MyBatis将SQL语句对象与用户提供的参数绑定,生成完整的SQL语句。

-天涯76的个人博客 625

【mybatis原理工作原理】

文章目录mybatis原理: mybatis原理: mybatis的工作原理就是:先封装sql,接着调用jdbc操作数据库,最后把数据库返回的表结果封装成java类。 通过代码实现jdbc查询操作: mybatis-config.xml类 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://myba

qq_33700648的博客 1445

MyBatis工作原理

MyBatis是一个轻量级的数据持久化框架,通过XML/注解配置简化JDBC操作。核心组件包括:1)配置加载(mybatis-config.xml)定义数据库连接;2)映射器(Mapper)接口与XML文件绑定SQL语句;3)SqlSessionFactory构建会话工厂;4)SqlSession执行SQL并处理结果映射。其工作流程为:解析配置→创建会话→执行映射SQL→结果转换。支持动态SQL和两级缓存,既保持SQL灵活性又减少样板代码,通过与Spring集成实现线程安全的事务管理。相比全自动ORM框架,

SHGXO183的博客 1339

mysql之MyBatis核心工作原理

接下来我们就开始MyBatis的源码之旅,首先大家要从宏观上了解Mybatis的整体框架分为三层,分别是基础支持层、核心处理层、和接口层。如下图然后根据前面讲解的MyBatis的应用案例,给出MyBatis的主要工作流程图在MyBatis的主要工作流程里面,不同的功能是由很多不同的类协作完成的,它们分布在MyBatis jar包的不同的package里面。大概有一千多个类,这样看起来不够清楚,不知道什么类在什么环节工作,属于什么层次。

励志成为一名优秀的全能型软件开发工程师。 1725

mybatis工作原理

m

lovezhaohaimig的博客 645

mybatis工作原理梳理

mybatis工作原理梳理

u013721324的博客 211
上一篇: MyBatis的框架架构设计
下一篇: MyBatis的功能架构
Flying_Fish_Xuan
Flying_Fish_Xuan 新星创作者: 后端开发技术领域 新星创作者: 后端开发技术领域
博客等级 码龄5年 1万+粉丝 2409原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flying_Fish_Xuan

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值