MyBatis执行流程与插件机制详解
MyBatis执行流程与插件机制详解 1. 对应简历段落 这篇文章对应简历中“熟悉 MyBatis 执行流程,处理遗留 XML 兼容、自定义插件、分页改造和 SQL 性能治理”的项目经历。简历可以写成: 深入梳理核心系统 MyBatis 执行链路,完成 Mapper XML 加载校验、动态 SQL 兼容、分页插件顺序治理、自定义拦截器适配和慢 SQL 诊断,支撑 Spring Boot 迁移过程中数百个 Mapper 平稳运行。 面试官会从这段继续追问:Mapper 接口为什么不用实现类也能执行?SqlSession、Executor、StatementHandler、ParameterHandler、ResultSetHandler 分别做什么?插件到底拦截了哪个对象?为什么插件顺序会影响分页和数据权限?一级缓存和二级缓存在哪里生效?MyBatis 和 Spring 事务是怎么结合的? 这类问题不能只背源码类名。更好的回答方式是把一次查询从 Mapper 方法调用开始,讲到 SQL 解析、参数绑定、执行器调用、结果集映射、缓存处理和插件拦截。再结合项目说明为什么理解执行流程能解决真实问题,例如分页 SQL 改写、动态数据权限注入、SQL 日志脱敏、慢查询定位、迁移后 XML 未加载排查。 2. 业务背景 遗留保险系统中,MyBatis 往往承担最核心的数据访问职责。系统可能有几百个 Mapper XML,覆盖客户、保单、订单、产品、渠道、机构、佣金、回访、报表等模块。早期项目大量使用手写 SQL,这是 MyBatis 的优势:可以精细控制复杂查询、Oracle 方言、动态条件、批量操作和存储过程调用。但随着系统演进,问题也会累积。 第一,XML 数量多,命名空间、SQL id、ResultMap、TypeHandler、动态 SQL 依赖复杂。迁移到 Spring Boot 后,只要扫描路径、资源加载或 SqlSessionFactory 配置有差异,就可能出现运行时找不到 statement。第二,分页、数据权限、租户隔离、SQL 日志等横切能力通常靠插件实现,插件顺序一变,最终 SQL 就可能不同。第三,老系统常用 Oracle 特性,例如 ROWNUM、CONNECT BY、序列、存储过程、DECODE,迁移过程中需要保证 SQL 语义不变。第四,保险查询场景复杂,运营后台一个列表可能关联客户、保单、机构、产品、状态流水和标签表,慢 SQL 很常见。第五,事务问题经常被误判为 MyBatis 问题,例如同一事务内查询读到缓存、批量执行未 flush、异常被吞导致不回滚。 ...