mybatis 01 认识MyBatis的设计理念

JDBC回顾

执行过程

项目开发中不需要再引入mysq驱动,java SPI机制已经帮我们加载驱动包,声明协议见下图
JAVA SPI:Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件

执行计划

类名 说明
Statement 简单执行计划,传输给数据库的是sql
PreparedStatement 1、继承了Statement, 2、通过绑定变量的形式,传输给数据库的是“sql”和“参数组”, 因此在批处理的场景下,优点很明显:数据包小、效率高 3、具备预编译能力,因此可防止**SQL**注入。 4、这里要注意,转义是在数据库端完成的。控制台打印的只是Mysql驱动对开发者的友好日志
CallableStatement 存储过程执行计划。可设置出参、读取出参

Statement的几个关键方法

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

MyBatis架构体系

SqlSession

SqlSession是Mybatis最重要的构建之一。

和其他ORM框架一样,SqlSession是外部调用的主入口。

为了方便开发者调用,它封装了常用接口(门面模式),内部除了实现CURD基本API以外,还具备一些辅助API。

SqlSession调用。​编写测试类,看看SqlSession内部机制:

我们执行上面的代码,断点进入sqlSession.selectList:

此时我们可以看到,SqlSession只是一个调用的入口,核心工作是交由Executor完成的

这引出了MyBatis的第二个核心类:Executor。

Executor

先看架构图:

几个重点:

  • 一级缓存由BaseExecutor完成;
  • 二级缓存由CachingExecutor完成;
  • 最下面三种执行器都继承自BaseExecutor,可应对不同的使用需求;

interface Executor

Executor的接口功能:增删改查、事务提交、关闭执行器、批处理刷新

class BaseExecutor

​实现了Executor接口,内部实现一级缓存。核心代码:

localCache是BaseExecutor的成员变量:

BaseExecutor的三个子类

类名 说明
SimpleExecutor 简单执行器 默认执行器,每次都会创建一个新的预处理器
ReuseExecutor 可重用执行器 在会话期间内,相同的sql只进行一次预处理
BatchExecutor 批处理执行器 批处理提交修改,必须执行flushStatements才会生效

class CacheExecutor

二级缓存执行器,组装了基础执行器,应用了装饰者模式

生成执行器的核心方法

Configuration中提供了两个实例化执行器的方法,开发者可传入ExecutorType枚举值来定义。另外,个人感觉605~614行(黄色、粉色区域),CachingExecutor这里的代码设计很有学习借鉴价值

StatementHandler

​StatementHandler,中文叫声明处理器,它是MyBatis的第三个核心。为了引出这个核心,我们需要继续调试上面selectList方法:

MyBatis和Hibernate等ORM框架底层都是基于数据库驱动,从源码可以看出Executor底层是使用StatementHandler与数据库交互的。MyBatis的StatementHandler对应了Mysql驱动中的Statement,MyBatis提供三种执行器与Mysql保持一一对应:


转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:mybatis 01 认识MyBatis的设计理念

字数:830

本文作者:夏来风

发布时间:2020-05-30, 10:00:00

原始链接:http://www.demo1024.com/blog/mybatis-01-index/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。