Skip to content

执行流程

一、核心基础概念补充

1. 会话相关组件及关系

  • SqlSessionFactory(会话工厂):全局唯一的工厂对象,负责创建SqlSession会话实例,其生命周期与应用一致。
  • SqlSession(会话):MyBatis与数据库的会话对象,包含执行SQL语句的所有方法,每次数据库操作创建一个新会话,用完关闭。
  • 关系SqlSessionFactory是工厂,SqlSession是产品;工厂负责创建会话,会话负责具体数据库操作,会话工厂保证配置全局唯一,会话保证每次操作隔离。

2. Executor(执行器)是什么?

Executor是MyBatis中操作数据库的接口,真正负责执行SQL语句,同时维护查询缓存,是SqlSession执行数据库操作的底层执行者。

3. MappedStatement是什么?为什么叫“映射对象”?

  • MappedStatement:封装了Mapper文件中SQL语句的映射信息,包括SQL语句、参数类型、返回值类型、映射规则等。
  • 为什么叫映射对象:因为它实现了从Java方法调用到数据库SQL执行的映射,包括参数映射(Java对象→SQL参数)和结果映射(SQL结果→Java对象),是MyBatis ORM映射的核心载体。

二、MyBatis完整执行流程

  1. 读取配置文件:加载mybatis-config.xml配置文件,解析运行环境、数据源、事务管理器和Mapper映射文件信息。
  2. 构建SqlSessionFactory:根据配置信息创建会话工厂,全局唯一,用于创建SqlSession
  3. 创建SqlSession:会话工厂创建会话对象,包含执行SQL的所有方法,每次操作创建一个会话。
  4. 获取Executor执行器:会话对象创建底层执行器,负责数据库操作和缓存维护。
  5. 获取MappedStatement对象:执行器加载Mapper文件中的SQL配置,封装为MappedStatement,包含SQL语句、参数/结果映射规则。
  6. 输入参数映射:将Java方法传入的参数(如POJO、Map)转换为SQL语句对应的参数类型,完成参数绑定。
  7. 执行SQL语句:执行器根据MappedStatement和绑定的参数,向数据库发送SQL请求。
  8. 输出结果映射:将数据库返回的结果集,根据MappedStatement中的结果映射规则,转换为对应的Java对象(如POJO、Map、List)。
  9. 关闭资源:关闭SqlSession会话,释放数据库连接。

三、关键组件说明

组件作用
mybatis-config.xml全局配置文件,定义数据源、事务、Mapper映射文件等
SqlSessionFactory会话工厂,全局唯一,创建SqlSession
SqlSession会话对象,封装数据库操作方法,如selectOneinsert
Executor执行器,底层执行SQL,维护缓存
MappedStatementSQL映射对象,封装SQL语句、参数/结果映射规则

面试相关问题

  1. 问:请说一下MyBatis的执行流程?答: MyBatis的执行流程分为以下步骤:

    1. 读取mybatis-config.xml配置文件,解析环境和Mapper信息;
    2. 根据配置构建SqlSessionFactory会话工厂;
    3. 通过会话工厂创建SqlSession会话对象;
    4. 会话获取Executor执行器,加载MappedStatement映射信息;
    5. 完成输入参数映射,执行SQL语句;
    6. 对数据库返回的结果集进行结果映射,转换为Java对象;
    7. 关闭SqlSession会话,释放资源。
  2. 问:SqlSessionFactory和SqlSession的关系是什么?答: SqlSessionFactory是工厂,SqlSession是产品。SqlSessionFactory全局唯一,负责创建SqlSessionSqlSession是每次数据库操作的会话对象,用完即关闭,保证会话隔离。

  3. 问:MappedStatement的作用是什么?答: MappedStatement封装了Mapper文件中SQL语句的映射信息,包括SQL语句本身、参数类型、返回值类型、参数映射和结果映射规则,是MyBatis实现ORM映射的核心对象,负责将Java方法调用映射为数据库SQL执行,并将结果映射回Java对象。

  4. 问:Executor执行器的作用是什么?答: Executor是MyBatis的底层执行接口,负责执行数据库SQL语句,同时维护查询缓存,是SqlSession执行数据库操作的实际执行者,SqlSessionselectinsert等方法最终都通过Executor完成。

Powered by VitePress 1.6.4 | 持续更新中