接上一篇内容,本篇继续深入 MyBatis 第二部分实战内容,讲解缓存机制、加载策略、注解开发模式。(本篇为 MyBatis 实战进阶的过渡篇目)
一、MyBatis 缓存机制:一级缓存与二级缓存
在高并发查询场景下,频繁访问数据库会极大降低系统性能,MyBatis 内置了两级缓存来减轻数据库压力。
1. 一级缓存
- 级别 :
SqlSession会话级别 - 默认状态 :默认开启,无需任何配置
- 生命周期:与当前 SqlSession 绑定,会话关闭(close)、事务提交(commit)、执行增删改操作时,缓存自动清空
- 工作机制:同一个会话内,执行完全相同的 SQL(相同参数、相同语句),只会查询一次数据库,后续直接从缓存获取
2. 二级缓存
- 级别 :
Mapper命名空间(namespace)级别,跨会话共享 - 默认状态:默认关闭,需要手动配置开启
- 生命周期:只要缓存未被清空,多个不同 SqlSession 都可以使用同一份缓存数据
- 适用场景:查询多、修改少的固定数据(字典表、分类表等)
3. 一级缓存与二级缓存区别
| 对比项 | 一级缓存 | 二级缓存 |
|---|---|---|
| 作用范围 | 单个 SqlSession 内 | 同一个 Mapper 下所有会话共享 |
| 开启方式 | 自动开启 | 手动配置开启 |
| 存储结构 | 会话内部 | 全局 Mapper 级别 |
| 数据安全性 | 会话隔离,相对安全 | 共享缓存,需注意脏数据问题 |
4. 为什么不直接使用 MySQL 自带缓存?
- MySQL 缓存粒度太粗:一张表发生任何修改,整张表的缓存全部失效
- 高并发场景下命中率极低,新版 MySQL 已逐渐废弃查询缓存
- 无法细粒度控制缓存规则,业务灵活性极差
5. 为什么要使用第三方缓存框架(Redis 等)?
- MyBatis 自带缓存为本地缓存,不支持分布式场景
- 第三方缓存可实现集群共享、持久化、过期策略、高可用
- 可自定义缓存规则,精细化控制缓存粒度,大幅提升分布式系统性能
二、立即加载 与 延迟(懒)加载
在一对多、多对一关联查询时,MyBatis 提供两种数据加载策略,根据业务场景选择使用。
1. 立即加载(立即查询)
- 执行主表查询时,一次性将关联表数据全部查询出来
- 优点:使用方便,一次 SQL 获取全部数据
- 缺点:如果关联数据未被使用,会造成资源浪费、SQL 执行效率下降
2. 延迟加载(懒加载)
- 先只查询主表数据,真正使用到关联对象时,才发送 SQL 查询从表
- 优点:节约数据库资源,提升查询速度,适合大数据量、关联数据使用频率低的场景
- 实现方式:在 MyBatis 全局配置文件中开启懒加载开关,配合
resultMap关联映射使用
3. 区别总结
- 立即加载:一查全查,简单直接
- 延迟加载:按需查询,性能更优
- 企业开发中,一对多场景优先使用延迟加载
三、MyBatis 两种开发方式:XML 配置 vs 注解开发
我们前面的 CRUD、多表关联均使用 XML 映射文件,MyBatis 同时支持注解式开发,两种方式各有适用场景。
1. 注解开发方式
直接在 Mapper 接口方法上使用注解编写 SQL,无需 XML 映射文件。示例:
java
@Select("select * from emp where eid = #{eid}")
Emp selectById(Integer eid);
- 优点:简单快捷,适合单表极简 CRUD
- 缺点:复杂 SQL 难以维护,多表联查、动态 SQL 几乎无法实现
2. XML 配置方式
- SQL 与 Java 代码完全解耦
- 完美支持动态 SQL:
<if>、<where>、<foreach>、<choose>等标签 - 支持复杂多表关联、
resultMap高级映射 - 便于后期维护、SQL 优化、版本管理
- 简单单表操作:可用注解快速开发
- 企业级复杂业务、多表联查、动态 SQL:使用 XML 方式
注意:XML 映射文件需正确引入 mybatis-3-mapper.dtd 约束
四、动态 SQL
在实际开发中,SQL 往往需要根据参数动态拼接,MyBatis 通过 XML 标签实现强大的动态 SQL:
<if>:条件判断<where>:自动处理多余的 and/or<foreach>:循环遍历集合(批量查询、批量插入)<set>:用于 update 动态更新字段
动态 SQL 是 MyBatis 替代原生 JDBC、Hibernate 的核心优势之一,也是复杂业务必备技能。下一篇将结合具体案例(if、where、foreach 标签)详细讲解其用法。
五、MyBatis-Plus 简化开发
在传统 MyBatis 基础上,MyBatis-Plus(MP) 已成为企业开发标配:
- 简单 CRUD 操作完全不需要手写 SQL
- 提供通用 Mapper、通用 Service,开箱即用
- 强大的条件构造器,可链式拼接查询条件
- 支持分页、逻辑删除、自动填充、乐观锁等增强功能
- 兼容原生 MyBatis,零成本迁移
六、总结
- MyBatis 提供一级、二级缓存,用于提升查询效率,分布式场景需结合第三方缓存
- 加载策略分为立即加载 与延迟加载,按需查询能显著优化性能
- 注解开发适合简单场景,XML 方式更适合企业复杂业务
- 动态 SQL ,应对多变的业务查询场景
- MyBatis-Plus 进一步简化开发,是未来实际工作中的主流工具