沉底一下对传统技术栈mybatis的认识先讲个基本的点。我们通过一个流程对mybatis的企业开发中的常见流程。1.引入依赖2.在配置类或者yaml中对mybatis做配置3.创建mapper接口类以及xml文件4.在test中测试一下写的接口写的有没有问题。对于中间有很多细节只是点可以深挖1.mybatis有哪些领域是要在yaml或者config文件包下做配置的。2.动态sql3.分页插件和逻辑4.如何在mybatis中写复杂的sql这些先不作为重点我们研究一下mybatis下的原理层面要认识的信息领域1.mybatis的执行原理是什么2.对于mybatis的插件相关的知识3.mybatis的缓存机制4.mybatisd的连接池机制5mybatis有哪些机制可以实现分页原理是什么一、先讲基本点MyBatis 企业开发标准流程你列的 4 步完全正确补充一个典型顺序1️⃣ 引入依赖Spring Boot 场景dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.3.0/version/dependency!-- 如果要用连接池监控再加 Druid --2️⃣ 在 yaml 中做核心配置mybatis:mapper-locations:classpath:mapper/*.xml# xml位置type-aliases-package:com.demo.entity# 实体类短名configuration:log-impl:org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case:true# 自动驼峰lazy-loading-enabled:true# 延迟加载开关3️⃣ 创建 Mapper 接口 XMLMapperpublicinterfaceUserMapper{UserselectById(Longid);}mappernamespacecom.demo.mapper.UserMapperselectidselectByIdresultTypeUserselect * from user where id #{id}/select/mapper4️⃣ 测试SpringBootTestclassUserMapperTest{AutowiredUserMapperuserMapper;Testvoidtest(){System.out.println(userMapper.selectById(1L));}}✅ 这是99% 项目每天都在做的事。二、沉底MyBatis 原理层 5 大核心领域你现在真正想深挖的是这 5 个我逐个给你讲“是什么 → 为什么 → 怎么实现”。1️⃣ MyBatis 执行原理最重要一句话通过动态代理把 Mapper 接口和 SQL 绑定通过Executor StatementHandler执行 SQL 并映射结果。核心流程背下来Mapper 接口 ↓ 动态代理 MapperProxy ↓ 调用 MapperMethod SqlSession → Executor → StatementHandler → ParameterHandler → ResultSetHandler角色解释组件职责MapperProxy为你的UserMapper接口生成代理对象MapperMethod解析接口方法 → 找 XML 中的 SQLSqlSession对外提供增删改查 APIExecutor执行器缓存、事务、批量StatementHandler处理 JDBC StatementParameterHandler设置参数ResultSetHandler把 ResultSet 映射成对象一个 SQL 执行的真实路径userMapper.selectById(1)→MapperProxy.invoke()→MapperMethod.execute()→SqlSession.selectOne()→CachingExecutor.query()→SimpleExecutor.doQuery()→StatementHandler.query()→ResultSetHandler.handleResultSets()这是 MyBatis 源码阅读的入口线。2️⃣ MyBatis 插件原理你已经接触过核心三要素Interceptor你写的插件逻辑Invocation当前执行方法的包装目标、参数、方法Plugin用 JDK 动态代理把多个拦截器串成责任链最经典的插件分页插件PageHelper数据权限插件慢 SQL 监控插件插件能拦截的四大对象Executor → 执行器分页、缓存 StatementHandler → SQL 处理改写 SQL ParameterHandler → 参数处理 ResultSetHandler → 结果处理脱敏、加密插件的本质是责任链 动态代理。3️⃣ MyBatis 缓存机制一级缓存 二级缓存缓存级别作用范围是否默认开启典型问题一级缓存SqlSession 内✅ 开启同一个 Session 多次查询走缓存二级缓存Mapper 级别❌ 关闭跨 Session 共享易脏读一级缓存一定要懂Useru1mapper.selectById(1);// 查 DBUseru2mapper.selectById(1);// 走缓存// 注意执行 insert/update/delete 会清空缓存二级缓存谨慎开启cache/实体必须序列化多表查询时一张表更新另一张表缓存不会失效 → 脏数据真实生产大部分项目只靠一级缓存 Redis。4️⃣ MyBatis 连接池机制关键点MyBatis 本身不实现连接池而是包装 JDBC 的 DataSource。常见连接池HikariCPSpring Boot 默认最快Druid功能最强有监控Tomcat JDBC PoolMyBatis 与连接池的关系MyBatis 配置 DataSource ↓ Spring 管理 Hikari/Druid ↓ MyBatis 每次执行 SQL 时 dataSource.getConnection() → 从连接池借连接 → 执行 SQL → 归还连接一个典型配置spring:datasource:hikari:maximum-pool-size:20minimum-idle:5MyBatis 只消费连接池不生产连接池。5️⃣ MyBatis 分页机制多种实现你问“有哪些机制可以实现分页”这是好问题分页方式原理优缺点物理分页推荐改写 SQLlimit ?,?性能好不走内存逻辑分页内存分页查全部数据Java 中截取性能极差禁用数组分页同上❌ 不用于生产物理分页的 3 种实现1️⃣PageHelper 插件最常用PageHelper.startPage(1,10);ListUserlistuserMapper.selectAll();PageInfopagenewPageInfo(list);原理拦截 Executor改写 SQL 增加limit2️⃣手写 limitselectidselectPageselect * from user limit #{offset}, #{pageSize}/select3️⃣分页拦截器自定义自己实现 Interceptor识别特定参数如PageParam动态改写 SQL结论PageHelper 覆盖 90% 场景手写 limit 适合极简项目。三、你现在可以形成的“MyBatis 原理地图”用户调用 Mapper 接口 ↓ 【动态代理】MapperProxy ↓ 【执行入口】SqlSession ↓ 【拦截器链】Plugin责任链 ↓ 【核心执行】Executor一级缓存在这里 ↓ 【可选】二级缓存 ↓ 【SQL 处理】StatementHandler ↓ 【参数】ParameterHandler ↓ 【JDBC】getConnection从连接池 ↓ 【结果映射】ResultSetHandler