MyBatis面试题 - 能详细说说MyBatis的执行流程吗?
引言
MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。了解MyBatis的执行流程对于深入掌握其工作原理和优化性能至关重要。本文将详细解析MyBatis的核心执行流程。
一、MyBatis整体架构
MyBatis的整体架构可以分为三层:
- 接口层:提供与数据库交互的API
- 核心处理层:SQL解析、参数映射、SQL执行、结果映射
- 基础支持层:连接管理、事务管理、缓存机制等
二、详细执行流程
1. 创建SqlSessionFactory
这是MyBatis初始化的第一步,通常通过读取配置文件来构建:
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
2. 创建SqlSession
SqlSession是MyBatis的核心接口,提供了执行SQL命令、获取映射器和管理事务的方法:
SqlSession session = sqlSessionFactory.openSession();
3. 获取Mapper接口
MyBatis通过动态代理技术为Mapper接口生成实现类:
UserMapper userMapper = session.getMapper(UserMapper.class);
4. SQL执行流程
当调用Mapper方法时,完整的执行流程如下:
5. 详细步骤解析
- 解析Mapper方法:通过MapperProxy解析接口方法名和参数
- 获取MappedStatement:根据方法名从Configuration中获取对应的MappedStatement
- 参数处理:ParameterHandler处理参数映射
- SQL执行:
- Executor根据配置创建StatementHandler
- StatementHandler创建JDBC Statement
- 执行SQL语句
- 结果映射:
- ResultSetHandler处理结果集
- 根据配置的resultMap进行对象映射
三、核心组件详解
1. Executor执行器
MyBatis有三种执行器:
- SimpleExecutor:每执行一次就开启一个Statement
- ReuseExecutor:重用预处理语句
- BatchExecutor:批量执行更新操作
2. StatementHandler
负责创建JDBC Statement,设置参数和执行SQL:
3. 二级缓存流程
四、总结
MyBatis的执行流程可以概括为:
- 通过SqlSessionFactoryBuilder构建SqlSessionFactory
- 通过SqlSessionFactory创建SqlSession
- 获取Mapper接口的代理对象
- 方法调用触发SQL执行流程
- 通过Executor协调StatementHandler、ParameterHandler和ResultSetHandler完成SQL执行和结果映射
理解这一流程有助于我们更好地使用MyBatis,并在出现问题时能够快速定位和解决。同时,对于性能优化(如缓存使用、批量操作等)也有重要指导意义。