乐途乐途
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
主页
  • 计算机基础

    • TCP/IP协议
    • Linux命令
    • HTTP协议
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • MyBatis
    • Spring
    • Spring MVC
    • Maven 入门
    • Maven 进阶
    • Java 设计模式
  • 缓存

    • Redis
联系
阿里云
  • 学习路径
  • 第1章 MyBatis概述与快速上手

    • 本章定位
    • MyBatis简介
    • 环境搭建
    • 第一个MyBatis程序
    • SqlSessionFactoryBuilder与openSession重载
    • SqlSessionFactory与SqlSession
    • SqlSession核心方法
    • 不使用 XML 构建 SqlSessionFactory
    • Mapper接口与映射方式
    • Java API 目录结构
  • 第2章 全局配置文件详解

    • 本章定位
    • properties
    • settings
    • typeAliases
    • typeHandlers
    • objectFactory
    • plugins
    • environments
    • transactionManager
    • dataSource
    • databaseIdProvider
    • mappers
    • 日志配置
  • 第3章 SQL映射文件基础

    • 本章定位
    • select
    • insert
    • update
    • delete
    • 参数传递与占位符
    • 主键生成策略
    • resultType
    • resultMap
    • 自动映射详解
    • sql片段
    • SQL 语句构建器
  • 第4章 动态SQL

    • 本章定位
    • if
    • choose、when、otherwise
    • where
    • set
    • foreach
    • trim
    • bind
    • script 元素:在注解映射器中启用动态 SQL
    • _databaseId 与动态 SQL 的多数据库支持
    • 动态 SQL 中插入脚本语言
  • 第5章 结果映射与关联查询

    • 本章定位
    • resultMap详解
    • association
    • collection
    • discriminator
    • N+1查询问题
    • 延迟加载
  • 第6章 MyBatis注解开发

    • 本章定位
    • @Select
    • @Insert
    • @Update
    • @Delete
    • @Param
    • @Options
    • @SelectKey
    • @Results
    • @Result
    • @One
    • @Many
    • @SelectProvider
  • 第7章 缓存与性能优化

    • 本章定位
    • 一级缓存
    • 二级缓存
    • 缓存配置详解
    • 自定义缓存
    • Executor执行器类型
    • 分页插件

"小崔,缓存不是万能药,是双刃剑。一级缓存默认开着,二级缓存默认关着,知道为什么吗?"——白歌

本章定位

一句话:本章解决"MyBatis如何分层缓存查询结果、各层缓存的作用域和适用场景是什么、如何集成第三方缓存和分页插件"的问题。

飞翔科技的电商大促前,李眉的压测报告显示数据库CPU飙到90%。白歌排查后发现:大量重复查询穿透到数据库,二级缓存没开,自定义缓存也没接。大翔要求:本周内完成缓存策略评审,每一层缓存的开启条件和失效策略必须文档化。这一章,小崔把MyBatis的性能优化武器库全部盘点清楚。


学习路线图

学习顺序说明:

  1. 先理解默认行为(一级缓存)→ 知道SqlSession级别的缓存是自动开启的,以及它的生命周期和局限
  2. 再学跨会话共享(二级缓存)→ 理解Mapper级别的缓存如何跨SqlSession共享,以及序列化要求
  3. 再学精细控制(缓存配置详解)→ 掌握eviction、flushInterval、size、readOnly等参数的含义
  4. 再看企业级扩展(自定义缓存)→ 集成Redis、Ehcache等分布式缓存,解决集群环境下的缓存一致性问题
  5. 最后看执行层优化(Executor / 分页插件)→ 理解执行器架构和物理分页的实现原理

文件关系说明

文件一句话角色
一级缓存.md默认缓存层:SqlSession生命周期内有效,默认开启,解决同会话重复查询,但会话关闭即失效
二级缓存.md跨会话缓存层:Mapper命名空间级别,需显式开启,解决多会话共享,但要求对象可序列化
缓存配置详解.md调参手册:eviction策略(LRU/LFU/SOFT/WEAK)、刷新间隔、大小限制、只读模式的权衡
自定义缓存.md企业级扩展:实现Cache接口接入Redis/Ehcache,解决分布式部署下的缓存同步和失效问题
Executor执行器类型.md执行架构基础:SIMPLE(默认)、REUSE(预编译复用)、BATCH(批量执行)的选择场景
分页插件.md物理分页方案:PageHelper等插件的拦截原理,以及分页查询与缓存的协同注意事项

知识图谱

核心概念关系:

  • 一级缓存(Local Cache):绑定在 SqlSession 上,默认开启,作用域最小,生命周期最短。适合同一会话内的循环查询或嵌套查询。关闭SqlSession即清空。
  • 二级缓存(Namespace Cache):绑定在 Mapper命名空间 上,默认关闭,需 <cache> 或 @CacheNamespace 显式开启。作用域跨SqlSession,但要求缓存对象实现Serializable。适合读多写少、数据变动不频繁的业务。
  • 自定义缓存:实现 org.apache.ibatis.cache.Cache 接口,将二级缓存的存储后端替换为Redis、Ehcache、Caffeine等。分布式环境下必须使用自定义缓存,否则多节点二级缓存各自为政,数据不一致。
  • Executor执行器:
    • SIMPLE:每次执行都创建新Statement,最通用
    • REUSE:复用预编译Statement,适合同SqlSession内重复执行相同SQL
    • BATCH:批量执行更新,减少网络往返,适合大批量插入/更新
  • 分页插件:通过拦截Executor的query方法,在SQL中注入 LIMIT/OFFSET(或各数据库方言等价物),实现物理分页。分页查询结果通常不走缓存,或需要独立缓存策略。

三层缓存作用域对比:

层级作用域默认状态适用场景注意事项
一级缓存SqlSession开启同会话重复查询会话关闭即失效,脏读风险低
二级缓存Mapper Namespace关闭跨会话读多写少需序列化,写操作会清空缓存
自定义缓存应用/集群需配置分布式部署、大数据量需处理缓存一致性和失效策略

与下一章的衔接

本章是MyBatis核心教程的最后一章。学完后,小崔已经掌握了从快速上手、全局配置、SQL映射、动态SQL、关联查询、注解开发到缓存优化的完整链路。

后续进阶方向:

  • Spring/SpringBoot集成:将MyBatis交给Spring管理SqlSessionFactory和事务,实现零XML配置
  • 插件开发:基于第02章的plugins机制,开发企业级拦截器(如数据权限、SQL审计、慢查询监控)
  • 源码阅读:深入理解MyBatis的Binding模块、Executor架构、Cache装饰器链

"缓存和分页是最后一道门。迈过去,MyBatis的核心你就通关了。剩下的,是在项目里摔打出来的经验。"——白歌

下一页
一级缓存