MyBatis 基本工作原理

核心流程

MyBatis 应用程序通过 SqlSessionFactoryBuilder 从 mybatis-config.xml 配置文件中构建出 SqlSessionFactory,然后 SqlSessionFactory 的实例直接开启一个 SqlSession,再通过 SqlSession 实例获得 Mapper 对象并运行 Mapper 映射的 SQL 语句,完成对数据库的 CRUD 和事务提交,之后关闭 SqlSession。如下图所示:

 

 

上面中流程就是 MyBatis 内部核心流程,每一步流程的详细说明如下文所述:

(1)读取 MyBatis 的配置文件。mybatis-config.xml 为 MyBatis 的全局配置文件,用于配置数据库连接信息。
(2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句,需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以加载多个映射文件,每个文件对应数据库中的一张表。
(3)构造会话工厂。通过 MyBatis 的环境配置信息构建会话工厂 SqlSessionFactory。
(4)创建会话对象。由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的所有方法。
(5)Executor 执行器。MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。
(6)MappedStatement 对象。在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。
(7)输入参数映射。输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数的过程。
(8)输出结果映射。输出结果类型可以是 Map、List 等集合类型,也可以是基本数据类型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

   

 

 

 

如何掌握 MyBatis 的原理

要结合 JDBC 来理解 MyBatis 的工作原理往往才能更透彻。我们知道,JDBC 有四个核心对象:
(1)DriverManager,用于注册数据库连接
(2)Connection,与数据库连接对象
(3)Statement/PrepareStatement,操作数据库SQL语句的对象
(4)ResultSet,结果集或一张虚拟表

 

MyBatis 也有几大核心对象:

(1)SqlSessionFactory 对象,每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的,SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在。
(2)SqlSession 对象,作为顶层 API,表示和数据库交互时的会话,通过它可完成 CRUD 操作,它不是线程安全的,每次使用完都要记得调用 close() 对其进行关闭。
(3)Executor 接口,作为调度的核心,负责 SQL 语句的生成和查询缓存的维护。

          

 

          SimpleExecutor(默认):每次都会创建新的 Statement。
          ReuseExecutor:重用预处理语句,跟 SimpleExecutor 的区别是内部会缓存语句。
          BatchExecutor:重用语句,并执行批量更新操作。
          CachingExecutor:基于装饰模式,用于实现查询缓存。

(4)StatementHandler 对象,封装了 Statement 操作。
(5)MappedStatement 对象,是 <select | insert | update | delete> 节点的封装。
(6)ResultHandler 对象,用于对返回的结果进行处理,最终得到自己想要的数据格式或类型。可以自定义返回类型。
(7)Configuration 对象,大管家,是所有配置的载体,也是四大对象(Executor、StatementHandler、ParameterHandler 和 ResultHandler)的创建工具。
(8)TypeHandler 对象,负责 Java 数据类型和数据库字段数据类型之间的映射。

 

 

posted @ 2022-12-05 15:37  Steven.Chow  阅读(419)  评论(0编辑  收藏  举报