目录
- 1 JDBC回顾
- 2 MyBatis的核心执行组件介绍
- 2.1 SqlSession
- 2.2 Executor
- 2.3 StatementHandler
- 3 Executor执行器分析
- 3.1 JDBC中的执行器
- 3.2 Mybatis执行器
- 3.2.1 Executor接口
- 3.2.2 BaseExecutor(基础执行器)
- 3.2.3 SimpleExecutor(简单执行器)
- 3.2.4 ReuseExecutor(可重用执行器)
- 3.2.5 BatchExecutor(批处理执行器)
- 3.2.6 CachingExecutor(二级缓存执行器)
- 3.3 Executor的创建:
- 4 一级缓存
- 5 二级缓存
- 6 小结
1 JDBC回顾
-
回顾JDBC执行过程
添加jar包 -> 获得连接 -> 预编译SQL -> 执行SQL,读取结果 -> 关闭事务
public static void main(String[] args) throws Exception { // 1、注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver()); // 2、建立连接 Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test? useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT", "root", "root"); // 3、编写sql,进行预编译 String sql = " select * from tb_brand;"; PreparedStatement ps = con.prepareStatement(sql); // 4、执行查询,得到结果集 ResultSet rs = ps.executeQuery(); while (rs.next()) { int bid = rs.getInt("bid"); String bname = rs.getString("bname"); System.out.println("====> bid=" + bid + "\tbname=" + bname); } //5、关闭事务 rs.close(); ps.close(); con.close(); }
-
MyBatis对JDBC封装的执行过程
2 MyBatis的核心执行组件介绍
在Mybatis中,SqlSession对数据库的操作,将委托给执行器Executor来完成都将委托给执行器
Executor来完成;
Mybatis执行过程,主要的执行模块是: SqlSession->Executor->StatementHandler->数据库
四个核心组件:
① 动态代理 MapperProxy
② SQL会话 SqlSession
③ 执行器 Executor
④ JDBC处理器 StatementHandler
2.1 SqlSession
SqlSession采用了门面模式方便来让我们使用。他不能跨线程使用,一级缓存生命周期和它一致;
基本功能:增删改查基本的操作功能;
辅助功能:提交、关闭会话;
门面模式:提供一个统一的门面接口API,使得系统更加容易使用。
2.2 Executor
基本功能:改、查、维护缓存;
辅助功能:提交、关闭执行器、批处理刷新;
Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作
委托给 StatementHandler完成。
2.3 StatementHandler
经过执行器处理后交给了StatementHandler(声明处理器);
主要作用就是:参数处理、结果处理;
StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过
java.sql.Statement 对象执行 SQL 语句并得到结果集,最后通过 ResultSetHandler 完成结果
集的映射,得到结果对象并返回。
3 Executor执行器分析
3.1 JDBC中的执行器
JDBC有三种执行器分别是Statement(简单执行器)、PreparedStatement(预处理执行器)、
CallableStatement(存储过程执行器)
Statement:基本功能:执行静态SQL
PreparedStatement:设置预编译,防止SQL注入
CallableStatement:设置出参、读取参数(用于执行存储过程)
3.2 Mybatis执行器
Executor继承结构分析
Mybatis给我们提供了三种执行器,分别是 :
SimpleExecutor(简单执行器)、
ResuseExecutor(可重用执行器)、
BathExecutor(批处理执行器)
这三个执行器继承了一个BaseExecutor(基础执行器),而这个基础执行器实现了Executor接口,其中
简单执行器是默认的执行器。
其实还有一种执行器CachingExecutor(二级缓存执行器)你开启二级缓存则会实例化它,在 BaseExecutor
的基础上,实现二级缓存功能。 (注意: BaseExecutor 的本地缓存,就是一级缓存。)
3.2.1 Executor接口
org.apache.ibatis.executor.Executor ,执行器接口。
主要定义了以下内容:
读和写操作相关的方法
事务相关的方法
缓存相关的方法
设置延迟加载的方法
设置包装的 Executor 对象的方法
public interface Executor { // 空 ResultHandler 对象的枚举 ResultHandler NO_RESULT_HANDLER = null; // 更新 or 插入 or 删除,由传入的 MappedStatement 的 SQL 所决定 int update(MappedStatement ms, Object parameter) throws SQLException; // 查询,带 ResultHandler + CacheKey + BoundSql <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws SQLException; // 查询,带 ResultHandler <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException; // 查询,返回值为 Cursor <E> Cursor<E> queryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds) throws SQLException; // 刷入批处理语句 List<BatchResult> flushStatements() throws SQLException; // 提交事务 void commit(boolean required) throws SQLException; // 回滚事务 void rollback(boolean required) throws SQLException; // 创建 CacheKey 对象 CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds, BoundSql boundSql); // 判断是否缓存 boolean isCached(MappedStatement ms, CacheKey key); // 清除本地缓存 void clearLocalCache();