MyBatis 特性(三):缓存、延迟加载、注解开发

接上一篇内容,本篇继续深入 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,零成本迁移

六、总结

  1. MyBatis 提供一级、二级缓存,用于提升查询效率,分布式场景需结合第三方缓存
  2. 加载策略分为立即加载延迟加载,按需查询能显著优化性能
  3. 注解开发适合简单场景,XML 方式更适合企业复杂业务
  4. 动态 SQL ,应对多变的业务查询场景
  5. MyBatis-Plus 进一步简化开发,是未来实际工作中的主流工具
相关推荐
三品吉他手会点灯2 小时前
C语言学习笔记 - 3. C概述 - C语言的起源和发展
c语言·笔记·学习
m0_377618232 小时前
如何解决预检查网络失败_runcluvfy阶段报错忽略与修复
jvm·数据库·python
m0_515098422 小时前
如何配置Oracle分布式事务_两阶段提交与DB_DOMAIN参数
jvm·数据库·python
m0_684501982 小时前
SQL嵌套查询在ETL流程的应用_数据清洗逻辑
jvm·数据库·python
djjdjdjdjjdj2 小时前
c++ circle元编程如何使用
jvm·数据库·python
老毛肚2 小时前
Redis高级
java·数据库·redis
2401_871696522 小时前
如何解决Data Guard主库ORA-16038日志无法归档_强制日志传输报错排查
jvm·数据库·python
djjdjdjdjjdj2 小时前
Python Selenium怎么定位元素_By.XPATH与By.CSS_SELECTOR操作DOM节点
jvm·数据库·python
识君啊2 小时前
38 个 MySQL 索引核心问题:原理、失效场景与优化实战
数据库·mysql