MyBatis源码-深入理解MyBatis Executor的设计思想


在这里插入图片描述

Pre

如果MyBatis的基础用法还不熟悉,31篇入门博客拿走不谢

戳戳戳 —> https://blog.csdn.net/yangshangwei/category_7205317.html

在这里插入图片描述


JDBC的执行过程

MyBatis 半自动的ORM框架 ,归根到底底层还是用的JDBC来访问数据库 , 所以有必要先回顾一下JDBC的执行过程

JDBC Demo

【演示Table 】
在这里插入图片描述


【演示Code】

public class JdbcTest {
    public static final String URL = "jdbc:mysql://127.0.0.1:3306/o2o?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false";
    public static final String USERNAME = "root";
    public static final String PASSWORD = "root";
    private Connection connection;

    @Before
    public void init() throws SQLException {
        // 第一步 获取连接
         connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
    }

    @After
    public void over() throws SQLException {
        connection.close();
    }

    @Test
    public void jdbcTest() throws SQLException {
        // 第二步  预编译  & 设置参数 
        String sql = "SELECT * FROM tb_area WHERE `area_name`=?";
        PreparedStatement sql1 = connection.prepareStatement(sql);
        sql1.setString(1,"北京");
        // 第三步 执行SQL
        sql1.execute();
        // 第四步 获取返回结果
        ResultSet resultSet = sql1.getResultSet();
        while (resultSet.next()) {
            System.out.println(resultSet.getString(3));
        }
        resultSet.close();
        sql1.close();;
    }
    
}

【执行结果】

在这里插入图片描述


【JDBC执行步骤总结】

无非就是下面几步

  1. 获取连接
  2. 预处理SQL ,设置参数等
  3. 执行SQL
  4. 获取返回结果

Mybatis既然是JDBC的封装框架, 那自然要处理 预处理这一步 ,所以有必要了解下JDBC中的Statement 接口


JDBC Statement 接口

整体接口和类的关系图如下
在这里插入图片描述

这里重点说一下 Statement 接口 ,通过该组件来发送对应的SQL与参数 .

它有三种类型:分别是 Statement,PreparedStatement和CallableStatement 接口, 继承关系如上,

【Statement接口】

  • 普通的不带参的查询SQL
  • 支持批量更新,批量删除

【PreparedStatement接口】

  • 继承自Statement接口
  • 可变参数的SQL,编译一次,执行多次,效率高
  • 安全,有效防止Sql注入等问题
  • 支持批量更新,批量删除

【CallableStatement接口】

  • 继承自PreparedStatement接口
  • 支持带参数的SQL操作
  • 支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持

在这里插入图片描述


除了常见的接口方法, Statement 中还有2个非常规方法需要关注下,因为后续在MyBatis中源码会有体现。

在这里插入图片描述

  • addBatch: 批处理操作,将多个SQL合并在一起,最后调用executeBatch 一起发送至数据库执行

  • setFetchSize:设置从数据库每次读取的数量单位。该举措是为了防止一次性从数据库加载数据过多,导致内存溢出。(MySQL不支持 ,Oracle支持)


MyBatis执行过程

推荐使用鲁班大叔的源码地图来梳理MyBatis的源码执行过程,更直观易懂 。 ------->戳这里<----------

四大组件

在这里插入图片描述

每个组件的作用如下:

  • 接口代理: 简化对MyBatis使用,底层使用动态代理实现

  • Sql会话: 提供增删改查API, 本身不做业务逻辑的处理,所有处理都会交给执行器Executor。这是一个典型的门面设计模式

  • 执行器: 核心作用是处理SQL请求、事务管理、维护缓存以及批处理等 。执行器在的角色更像是一个管理员,接收SQL请求,然后根据缓存、批处理等逻辑来决定如何执行这个SQL请求,并交给JDBC处理器执行具体SQL

  • JDBC处理器: 主要具体处理JDBCSQL和参数 。在会话中每调用一次CRUD,JDBC处理器就会生成一个实例与之对应(命中缓存除外)

StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);

请注意在一次SQL会话过程当中四个组件的实例比值分别是 1:1:1:n


组件之间的关系

一个SQL请求通过会话到达执行器,然后交给对应的JDBC处理器进行处理。

另外所有的组件都不是线程安全的,不能跨线程使用 (currentSql 全局变量 ,线程不安全 )

在这里插入图片描述

接下来我们重点看下Executor组件,从源码上剖析该组件的设计思想。


Executor 执行器组件

架构总览

在这里插入图片描述

Executor是MyBatis执行者接口 ,执行器的主要功能包括:

  • 基本功能:改、查,(增删—>也是改)

  • 缓存维护:这里的缓存主要是为一级缓存服务,功能包括创建缓存Key、清理缓存、判断缓存是否存在

  • 事务管理:提交、回滚、关闭、批处理刷新


接口继承关系

在这里插入图片描述

后面我们重点看下Executor的 三个实现子类。

分别是:SimpleExecutor(简单执行器)、ReuseExecutor(重用执行器)、BatchExecutor(批处理执行器)。

MyBatis源码-深入解读Executor的三个实现类


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MyBatis 是一个开源的持久层框架,可以方便地将 SQL 语句和 Java 对象进行映射。如果您想要学习 MyBatis 源码,可以按照以下步骤进行: 1. 了解 MyBatis 的架构和设计原理。可以阅读官方文档和相关书籍,例如《MyBatis 技术内幕》。 2. 下载 MyBatis 的源代码,并导入到 IDE 中。MyBatis 使用 Maven 进行构建,您可以使用 IDE 的 Maven 插件来下载依赖项。 3. 查看 MyBatis 的源代码结构。MyBatis主要代码在 `mybatis-3` 模块中,包括 `src/main/java` 和 `src/main/resources` 目录。其中,`src/main/java` 目录包含了 MyBatis 的核心代码,例如 `org.apache.ibatis.session.SqlSession` 类;`src/main/resources` 目录包含了 MyBatis 的配置文件和映射文件。 4. 阅读 MyBatis 的源代码。可以从 MyBatis 的入口处 `org.apache.ibatis.session.SqlSessionFactoryBuilder` 开始,深入了解 MyBatis 的初始化流程、SQL 语句的执行流程、映射文件的解析和缓存等。 5. 调试 MyBatis 的源代码。可以使用 IDE 的调试功能,对 MyBatis 进行单步调试,观察代码的执行流程,加深对 MyBatis 的理解。 6. 学习 MyBatis 的单元测试。MyBatis 的单元测试位于 `src/test/java` 目录中,可以通过单元测试来了解 MyBatis 的各个功能点的使用方法和测试用例。 7. 参与 MyBatis 的开发。如果您对 MyBatis 源码有深入的了解,并希望为 MyBatis 做出贡献,可以参与 MyBatis 的开发,贡献代码和文档,提交 issue 和 PR。MyBatis 的开发社区非常活跃,可以在官方网站和 GitHub 上找到相关信息。 希望这些步骤对您学习 MyBatis 源码有所帮助。 ### 回答2: MyBatis是一个开源的Java持久层框架,通过操作对象与数据库关系映射来提供数据持久化的功能。了解MyBatis源码是学习和使用该框架的重要一步。 首先,MyBatis源码结构比较清晰,主要分为核心模块和附属模块。核心模块包括XML配置解析、SQL语句解析、参数处理、数据库连接管理等功能的实现,是实现MyBatis基本功能的核心部分。附属模块包括缓存、事务、插件等额外功能的实现,可以根据需要进行扩展和配置。 学习MyBatis源码可以从以下几个方面入手: 1. 配置文件解析:MyBatis通过XML配置文件来进行相关的配置,了解配置文件的解析过程可以帮助理解MyBatis的初始化过程和各项配置的作用。 2. SQL语句解析与执行:MyBatis将SQL语句封装成MappedStatement对象进行管理,了解MappedStatement的生成过程,以及SQL语句的解析、参数处理和执行过程,可以深入了解MyBatis的SQL执行原理。 3. 会话管理和事务处理:MyBatis采用SqlSessionFactory和SqlSession来管理数据库连接和事务,在MyBatis源码中可以学习到如何管理数据库连接池、事务的提交和回滚等核心功能的实现。 4. 缓存机制:MyBatis提供了一级缓存和二级缓存的功能,了解缓存的生成和更新过程,以及缓存的命中和失效原理,可以提高数据库查询性能。 总之,通过学习MyBatis源码,可以加深对该框架的理解,掌握其内部实现原理,有助于在使用时更加灵活和高效地进行开发。同时,也为以后解决一些特殊问题提供了更多的思路和方法。 ### 回答3: MyBatis是一个优秀的持久层框架,学习其源码有助于理解其底层原理和设计思想。 首先,可以从MyBatis的入口开始学习,即SqlSessionFactoryBuilder类。该类负责解析配置文件、创建Configuration对象,并通过Configuration对象创建SqlSessionFactory实例。 接下来,可以学习Configuration类,该类负责管理整个MyBatis的配置信息。其中包括了数据库连接信息、映射文件信息、缓存信息等。在该类内部,会调用XMLMapperBuilder类解析映射文件,在解析映射文件过程中,会创建MappedStatement对象,该对象表示一条SQL语句的映射信息。 学习MappedStatement对象可以了解MyBatis的SQL语句解析过程。该对象包含了SQL语句的相关信息,包括参数映射关系、返回结果映射关系等。在执行SQL语句时,会使用ParameterHandler类处理参数,通过ResultSetHandler类处理查询结果。 同时,学习到Executor接口及其实现类,可以了解MyBatis的执行过程。Executor负责执行SQL语句,其中包括了写操作的update方法和读操作的query方法。在执行过程中,会通过StatementHandler类创建PreparedStatement对象,并通过ResultSetHandler类处理执行结果。 最后,还可以学习到MyBatis的事务处理和缓存机制。Transaction接口及其实现类负责事务管理,通过JDBC的事务机制实现了事务的提交和回滚。而Cache接口及其实现类负责缓存查询结果,在查询时会先从缓存中查找结果。 总结来说,通过学习MyBatis源码可以深入理解其底层原理和设计思想。从SqlSessionFactory的创建开始,到Configuration的配置解析、MappedStatement的创建,再到Executor的执行过程和Transaction的事务管理,以及Cache的缓存机制,逐步掌握MyBatis的各个组件和它们之间的交互关系。这对于我们使用MyBatis开发项目,解决问题和优化性能都具有积极的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小小工匠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值