2026/4/6 11:13:05
网站建设
项目流程
大家好我是锋哥。今天分享关于【Java高频面试题能说说MyBatis的工作原理吗】面试题 。希望对大家有帮助Java高频面试题能说说MyBatis的工作原理吗1. MyBatis 的整体架构MyBatis 是一个半自动化的 ORM 框架对象关系映射它主要负责将Java 对象与SQL 数据库映射提供 SQL 映射配置让开发者可以写自定义 SQL同时避免重复 JDBC 代码。整体架构大致可以分为四层应用层调用 MyBatis 的接口进行数据库操作核心层SqlSession负责处理 SQL 执行、事务管理、缓存映射器层MapperXML 或注解定义 SQL 映射数据库层真实执行 SQL 的数据库。2. 核心组件MyBatis 核心组件包括SqlSessionFactory核心工厂创建SqlSession实例。配置文件中包含数据库连接信息、映射文件路径、全局参数等。SqlSession提供操作数据库的接口增删改查。是 MyBatis 的工作主入口。线程不安全每次使用完要关闭。Mapper 接口 / XML 映射文件Mapper 接口定义方法XML 中写 SQL。MyBatis 会生成 Mapper 的代理对象实现方法与 SQL 的映射。Executor核心执行器负责处理 SQL 执行、缓存、事务。分为SimpleExecutor、ReuseExecutor、BatchExecutor。ConfigurationMyBatis 全局配置存储所有映射关系、SQL 语句、缓存策略等。StatementHandler / ParameterHandler / ResultSetHandlerStatementHandler负责 JDBC Statement 执行 SQL。ParameterHandler设置 SQL 参数。ResultSetHandler处理查询结果集封装成 Java 对象。3. 工作流程以查询为例假设你有一个UserMapper.selectUserById方法获取 SqlSessionSqlSession sqlSession sqlSessionFactory.openSession();获取 Mapper 代理对象UserMapper mapper sqlSession.getMapper(UserMapper.class);调用 Mapper 方法User user mapper.selectUserById(1);MyBatis 内部流程Mapper 方法调用被代理→MapperProxy拦截从 Configuration 获取对应的 MappedStatement包括 SQL、参数类型、返回类型Executor 执行 SQLParameterHandler设置 SQL 参数StatementHandler生成 JDBC Statement执行 SQLResultSetHandler解析结果封装成 Java 对象返回结果给调用方。关闭 SqlSessionsqlSession.close();4. 缓存机制MyBatis 提供两级缓存一级缓存Session 级默认开启作用范围是同一个 SqlSession。每次查询会先从缓存获取结果。二级缓存Mapper 级可选需要在 Mapper 配置文件中开启。跨 SqlSession可在不同 Session 之间共享缓存。5. 核心特点总结SQL 控制权完全掌握在开发者手中→ 灵活。动态 SQL 支持→ 通过if、choose、foreach等动态生成 SQL。Mapper 接口 XML→ 接口化调用解耦 SQL 和 Java。缓存机制→ 一级、二级缓存减少数据库压力。插件机制→ 可通过拦截器扩展 Executor、StatementHandler、ParameterHandler、ResultSetHandler。