最近看了些 MyBatis 的源码,虽说不是很深入但是也对 MyBatis 的查询的执行流程有了整体的了解。本文将会从 selectOne 方法开始一直追溯到 JDBC 的访问数据库,来看一看 MyBatis 到底做了什么,简单的对 MyBatis 的查询接口有个简单的整体的了解。
文本会以 MyBatis 源码为主,不考虑 Spring 的封装。
第零步:MyBatis 查询示例
MyBtais 3 官网:https://mybatis.org/mybatis-3/zh/getting-started.html
在开始阅读源码之前,我们先来复习一下使用 MyBatis 调用查询接口进行查询的方法,下面是从 MyBatis 3 的官方中获取的查询示例:
// 使用 XML 构建 SqlSessionFactory |
从上面的示例中可以看出,MyBatis 对我们开放的顶层 API 接口是由 SqlSession 接口所提供的。我们接下来就由 SqlSession.selectOne 为起点开始阅读 MyBatis 的查询接口源码。
第一步:SqlSession 顶层接口
1.1 SqlSession 接口
SqlSession 作为 MyBatis 的顶层接口,为我们提供了许多功能。通过这个接口,我们可以执行 SQL 命令、获取映射器和管理事务。本文会聚焦在 selectOne 方法上进行解析。
public interface SqlSession extends Closeable { |
1.2 DefaultSqlSession 实现类
从类名我们就知道,这是 SqlSeesion 接口的默认实现类。所以说 SelectOne 的默认实现也在这里。
// 这是 SqlSession 的默认实现 |
第二步:Executor 执行器
2.1 Executor 接口
在第一步,我们在 SqlSession 完成了查询前的参数准备,然后调用了 executor.query 方法使用执行器进行查询操作。老规矩,我们先来看看 Executor 接口。
public interface Executor { |
2.2 BaseExecutor 实现类
从类名我们就知道,这是 Executor 接口的一个抽象实现类。除了提供 Executor 接口方法的实现,还提供了其他的抽象方法让子类实现。
public abstract class BaseExecutor implements Executor { |
2.3 SimpleExecutor 实现类
SimpleExecutor 是 BaseExecutor 比较常用的实现类。
public class SimpleExecutor extends BaseExecutor { |
第三步:StatementHandler 处理器
StatementHandler 接口
StatementHandler 这是一个与 JDBC 交互的处理器,可以说是 MyBatis 的核心。
public interface StatementHandler { |
SimpleStatementHandler 实现类
public class SimpleStatementHandler extends BaseStatementHandler { |
最后的总结
流程图示

流程总结
第一步 SqlSession 顶层 API:
在第一步中,主要是准备查询所需的组件。比较重要的就是 MappedStatement 实例对象,还有一些其他的组件,比如:RowBounds 分页对象、对查询参数进行包装、结果处理器等。
第二步 Executor 执行器:
在第二步中,主要进行查询执行。查询执行分为两部分:1. 从缓存中查询。2. 使用 StatementHandler 从数据库中查询。
第三步 StatementHandler 处理器:
在第三步中,就是与 JDBC 进行交互的部分。使用 JDBC 连接数据库。
到这里本文就结束了,其实阅读源码对于开发来说其实并没有实际的帮助。但是我们我们所使用的工具(框架)有了更深的了解,可能在开发中会更有自信吧。这次其实并没有过于深入的研究源码,仅仅是顺这一条线大致梳理了一下 MyBatis 执行的 SQL 命令的流程而已。