| 问题 | 关键词/关键概念 | | --------------------- | -------------------------------------------------------------------------------------------------------------- | | Mybatis可以实现动态SQL?| **可以**:if、choose/when/otherwise、trim/where/set、foreach标签、OGNL表达式、SQL片段复用 | | `#` 和`
的区别?什么情况必须用$?| **#{}**:预编译、参数占位符、防SQL注入、自动类型转换<br>**${}**:字符串替换、直接拼接、SQL注入风险<br>**必须用$场景**:动态表名、列名、ORDER BY字段、动态SQL片段 | | MyBatis-Plus有什么用?| **增强功能**:CRUD封装、条件构造器、分页插件、代码生成器、乐观锁、逻辑删除、自动填充、多租户、性能分析 | | MyBatis-Plus分页原理?| **拦截器机制**:PaginationInnerInterceptor、拦截SQL、自动添加limit、count查询、方言适配、物理分页 | | MyBatis与Hibernate区别?| **MyBatis**:半ORM、SQL可控、轻量级、学习简单、灵活性高<br>**Hibernate**:全ORM、HQL、重量级、自动化程度高、数据库无关性好 | | Mybatis是否支持延迟加载?原理?| **支持**:lazyLoadingEnabled配置<br>**原理**:动态代理、CGLIB/Javassist、首次调用时触发查询、按需加载关联对象 | | Mybatis插件运行原理?| **拦截器链**:Interceptor接口、@Intercepts注解、责任链模式、动态代理、可拦截Executor/StatementHandler/ParameterHandler/ResultSetHandler | | Mybatis如何实现字段映射?| **自动映射**:驼峰命名转换、resultMap配置、列别名、TypeHandler类型处理器、@Results注解 | | Mybatis用什么连接池?| **三种类型**:UNPOOLED无连接池、POOLED内置连接池、JNDI容器连接池<br>**整合第三方**:Druid、HikariCP、C3P0 | | Mybatis的优点?| **SQL灵活**、**轻量级**、**易学习**、**与Spring集成好**、**支持动态SQL**、**提供映射标签**、**可调优SQL** | | Mybatis工作原理?| **流程**:加载配置→创建SqlSessionFactory→获取SqlSession→获取Mapper代理→执行SQL→映射结果→返回结果 | | Mybatis缓存机制?| **一级缓存**:SqlSession级别、默认开启、本地缓存、事务内有效<br>**二级缓存**:Mapper级别、需手动开启、跨SqlSession共享、可配置策略 | | PageHelper分页原理?| **ThreadLocal**保存分页参数、**拦截器**修改SQL、自动添加limit、count统计、方言识别、物理分页实现 | | RowBounds分页原理?| **内存分页**:查询全部数据、内存中截取、逻辑分页、适合小数据量、性能差不推荐 | | 什么是ORM?常用框架?| **ORM**:对象关系映射、对象与数据库表映射、简化数据库操作<br>**框架**:MyBatis、Hibernate、JPA、Spring Data JPA、JOOQ | | 使用MyBatis如何实现分页?| **方式**:1.RowBounds逻辑分页 2.物理分页手写limit 3.PageHelper插件 4.MyBatis-Plus分页 5.拦截器自定义 | # MyBatis核心概念详解 ## **核心组件** ```Java SqlSessionFactoryBuilder → SqlSessionFactory → SqlSession → Mapper 构建器 工厂 会话 映射器 ``` ## **执行流程** 1. **配置解析**:XML/注解配置解析 2. **代理创建**:MapperProxy动态代理 3. **SQL解析**:动态SQL生成 4. **参数处理**:ParameterHandler处理 5. **SQL执行**:Executor执行器 6. **结果映射**:ResultSetHandler处理 ## **缓存架构** ```Java 一级缓存(默认开启) ├── 作用域:SqlSession ├── 存储:本地HashMap └── 失效:增删改/提交/关闭 二级缓存(需配置) ├── 作用域:namespace ├── 存储:可配置(EhCache/Redis) └── 失效:增删改操作 ``` ## **插件机制(拦截器)** ```java @Intercepts({ @Signature(type = Executor.class, method = "query", args = {...}) }) public class MyPlugin implements Interceptor { // 拦截逻辑 } ``` ## **动态SQL标签** - **条件判断**:`<if>` `<choose>` `<when>` `<otherwise>` - **循环处理**:`<foreach>` - **字符处理**:`<trim>` `<where>` `<set>` - **SQL片段**:`<sql>` `<include>` ## **最佳实践** 1. **批量操作**:使用foreach或批处理 2. **懒加载**:合理配置延迟加载 3. **缓存策略**:根据业务选择缓存级别 4. **SQL优化**:使用explain分析 5. **连接池**:选择高性能连接池如HikariCP ## **性能优化** - 合理使用缓存 - 避免N+1查询问题 - 使用批量操作 - 优化resultMap映射 - 选择合适的fetchSize ## **常见问题** - **SQL注入**:使用#{}而非${} - **缓存穿透**:合理设置缓存策略 - **大结果集**:使用流式查询 - **事务管理**:Spring集成事务