主题切换
执行流程
一、核心基础概念补充
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完整执行流程
- 读取配置文件:加载
mybatis-config.xml配置文件,解析运行环境、数据源、事务管理器和Mapper映射文件信息。 - 构建SqlSessionFactory:根据配置信息创建会话工厂,全局唯一,用于创建
SqlSession。 - 创建SqlSession:会话工厂创建会话对象,包含执行SQL的所有方法,每次操作创建一个会话。
- 获取Executor执行器:会话对象创建底层执行器,负责数据库操作和缓存维护。
- 获取MappedStatement对象:执行器加载Mapper文件中的SQL配置,封装为
MappedStatement,包含SQL语句、参数/结果映射规则。 - 输入参数映射:将Java方法传入的参数(如POJO、Map)转换为SQL语句对应的参数类型,完成参数绑定。
- 执行SQL语句:执行器根据
MappedStatement和绑定的参数,向数据库发送SQL请求。 - 输出结果映射:将数据库返回的结果集,根据
MappedStatement中的结果映射规则,转换为对应的Java对象(如POJO、Map、List)。 - 关闭资源:关闭
SqlSession会话,释放数据库连接。
三、关键组件说明
| 组件 | 作用 |
|---|---|
mybatis-config.xml | 全局配置文件,定义数据源、事务、Mapper映射文件等 |
SqlSessionFactory | 会话工厂,全局唯一,创建SqlSession |
SqlSession | 会话对象,封装数据库操作方法,如selectOne、insert |
Executor | 执行器,底层执行SQL,维护缓存 |
MappedStatement | SQL映射对象,封装SQL语句、参数/结果映射规则 |
面试相关问题
问:请说一下MyBatis的执行流程?答: MyBatis的执行流程分为以下步骤:
- 读取
mybatis-config.xml配置文件,解析环境和Mapper信息; - 根据配置构建
SqlSessionFactory会话工厂; - 通过会话工厂创建
SqlSession会话对象; - 会话获取
Executor执行器,加载MappedStatement映射信息; - 完成输入参数映射,执行SQL语句;
- 对数据库返回的结果集进行结果映射,转换为Java对象;
- 关闭
SqlSession会话,释放资源。
- 读取
问:SqlSessionFactory和SqlSession的关系是什么?答:
SqlSessionFactory是工厂,SqlSession是产品。SqlSessionFactory全局唯一,负责创建SqlSession;SqlSession是每次数据库操作的会话对象,用完即关闭,保证会话隔离。问:MappedStatement的作用是什么?答:
MappedStatement封装了Mapper文件中SQL语句的映射信息,包括SQL语句本身、参数类型、返回值类型、参数映射和结果映射规则,是MyBatis实现ORM映射的核心对象,负责将Java方法调用映射为数据库SQL执行,并将结果映射回Java对象。问:Executor执行器的作用是什么?答:
Executor是MyBatis的底层执行接口,负责执行数据库SQL语句,同时维护查询缓存,是SqlSession执行数据库操作的实际执行者,SqlSession的select、insert等方法最终都通过Executor完成。