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

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

20200604232843431.png


Pre


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

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

20200604233018261.png



JDBC的执行过程


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


JDBC Demo


【演示Table 】


20200605002428867.png


【演示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();;
    }
}


【执行结果】

20200605002414917.png


【JDBC执行步骤总结】

无非就是下面几步

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

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


JDBC Statement 接口

整体接口和类的关系图如下

20200605111523954.png

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


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


【Statement接口】

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

【PreparedStatement接口】

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

【CallableStatement接口】

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


20200610163832579.png


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


20200605162336941.png

  • addBatch: 批处理操作,将多个SQL合并在一起,最后调用executeBatch 一起发送至数据库执行
  • setFetchSize:设置从数据库每次读取的数量单位。该举措是为了防止一次性从数据库加载数据过多,导致内存溢出。(MySQL不支持 ,Oracle支持)


MyBatis执行过程


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


四大组件



20200605164130429.png


每个组件的作用如下:


接口代理: 简化对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 全局变量 ,线程不安全 )

2020061016365729.png

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


Executor 执行器组件

架构总览



20200610163315962.png

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

  • 基本功能:改、查,(增删—>也是改)
  • 缓存维护:这里的缓存主要是为一级缓存服务,功能包括创建缓存Key、清理缓存、判断缓存是否存在
  • 事务管理:提交、回滚、关闭、批处理刷新


接口继承关系

20200605171752866.png


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

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

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

相关文章
|
2月前
|
SQL XML Java
mybatis-源码深入分析(一)
mybatis-源码深入分析(一)
|
1月前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
45 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
1月前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
129 0
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
3月前
|
XML Java 数据库连接
mybatis源码研究、搭建mybatis源码运行的环境
这篇文章详细介绍了如何搭建MyBatis源码运行的环境,包括创建Maven项目、导入源码、添加代码、Debug运行研究源码,并提供了解决常见问题的方法和链接到搭建好的环境。
mybatis源码研究、搭建mybatis源码运行的环境
|
3月前
|
Web App开发 前端开发 关系型数据库
基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】
这篇文章介绍了一个基于SpringBoot+Vue+Redis+Mybatis技术栈开发的商城购物系统,包括系统功能、页面展示、前后端项目结构和核心代码,以及如何获取系统源码和答辩PPT的方法。
|
3月前
|
供应链 前端开发 Java
服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】
该博客文章介绍了一个使用Mybatis、Layui、MVC和JSP技术栈开发的服装库存管理系统,包括注册登录、权限管理、用户和货号管理、库存管理等功能,并提供了源码下载链接。
服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】
|
3月前
|
缓存 Java 数据库连接
我要手撕mybatis源码
该文章深入分析了MyBatis框架的初始化和数据读写阶段的源码,详细阐述了MyBatis如何通过配置文件解析、建立数据库连接、映射接口绑定、动态代理、查询缓存和结果集处理等步骤实现ORM功能,以及与传统JDBC编程相比的优势。
我要手撕mybatis源码
|
1月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
109 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
54 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
303 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个