MyBatis运行原理

一、MyBatis 的工作原理

流程图
  1. 通过 Resources 加载全局配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。
  2. 实例化 SqlSessionFactoryBuilder 构建器并调用build()方法。
  3. 创建 XmlConfigBuilder解析全局配置文件流,并把解析结果存放在 Configuration 中。
  4. 把Configuratin传递给 SqlSessionFactory 接口实现类 DefaultSqlSessionFactory,到此 SqlSessionFactory 工厂创建成功。
  5. 由 SqlSessionFactory 工厂创建 SqlSession,该对象中包含了执行 SQL 语句的所有方法。每次创建 SqlSession 时,都需要由 TransactionFactory 创建 Transaction对象,同时还需要创建 SqlSession 的执行器 Excutor,最后实例化DefaultSqlSession,传递给 SqlSession 接口。
  6. 根据项目需求使用 SqlSession对象完成和数据库的交互。
    6.1. 用户程序调用mybatis接口层api(即Mapper接口中的方法)
    6.2. SqlSession通过调用api的Statement ID找到对应的MappedStatement对象
    6.3. 通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象
    6.4. 执行sql
    6.5. 借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
  7. 关闭 SqlSession

PS:mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)来构建SqlSessionFactory(\color{red}{SqlSessionFactory是线程安全的});
然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。
说明:\color{red}{SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象},类似jdbc中的Connection,底层就封装了jdbc连接。

二、MyBatis的主要构件及其相互关系

从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个:

  • SqlSession 作为MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能
  • Executor MyBatis执行器,是MyBatis 调度的核心,负责SQL语句的生成和查询缓存的维护
  • StatementHandler 封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
  • ParameterHandler 负责对用户传递的参数转换成JDBC Statement 所需要的参数,
  • ResultSetHandler 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合;
  • TypeHandler 负责java数据类型和jdbc数据类型之间的映射和转换
  • MappedStatement MappedStatement维护了一条<select|update|delete|insert>节点的封装,
  • SqlSource 负责根据用户传递的parameterObject,动态地生成SQL语句,将信息封装到BoundSql对象中,并返回
  • BoundSql 表示动态生成的SQL语句以及相应的参数信息
  • Configuration MyBatis所有的配置信息都维持在Configuration对象之中。

它们的关系如下图所示


image.png

MyBatis 的工作原理 http://c.biancheng.net/view/4304.html
Mybatis之工作原理 https://blog.csdn.net/u014297148/article/details/78696096
Mybatis之工作原理代码流程解析 https://blog.csdn.net/qq_21150865/article/details/84305338?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
《深入理解mybatis原理》 MyBatis的架构设计以及实例分析 https://blog.csdn.net/luanlouis/article/details/40422941?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。