当前位置: 首页 > news >正文

Mybatis第三章(补充):MyBatis二级缓存必懂---序列化与反序列化(从概念到实操)

在MyBatis学习中,二级缓存的开启离不开「序列化」和「反序列化」,很多小伙伴会疑惑:这两个操作到底是什么?为什么二级缓存必须依赖它们?和一级缓存有什么区别?

今天就用最通俗的语言+实操场景,把这两个知识点讲透,结合MyBatis二级缓存场景,新手也能轻松理解。

本博客的代码示例 在Mybatis第三章的博客中的项目上 进行展示

一、先搞懂核心:序列化与反序列化是什么?

其实一句话就能概括:序列化是「存」,反序列化是「取」,核心目的是让Java对象能被存储、传输,适配二级缓存的跨会话共享需求。

1. 序列化(Serialization)

定义:将Java对象(比如我们常用的User实体类),转换为二进制字节数据(字节数组)的过程。

类比理解:就像我们把一件完整的家具(Java对象),拆解成一个个小零件(字节),这样才能方便打包、运输(对应缓存存储)——如果不拆解,完整的家具(对象)无法塞进缓存的“存储空间”。

在MyBatis二级缓存中:当第一个SqlSession查询完数据,执行close()或commit()时,MyBatis会自动将查询到的实体对象(如User)进行序列化,把字节数据存入二级缓存中。

2. 反序列化(Deserialization)

定义:将存储的二进制字节数据,重新组装、还原成一个全新的Java对象的过程。

类比理解:把运输过来的小零件(字节),重新组装成原来的家具(Java对象),虽然和原来的家具长得一样,但已经是一个全新的个体——这也是二级缓存两次查询对象地址不同的核心原因。

在MyBatis二级缓存中:当第二个SqlSession查询相同数据时,会从二级缓存中读取字节数据,通过反序列化生成一个新的实体对象,返回给程序,从而避免再次查询数据库。

核心口诀(记死不丢分)

序列化:对象 → 字节(存缓存)

反序列化:字节 → 新对象(取缓存)

二、为什么MyBatis二级缓存必须用序列化?

这是最关键的问题,结合我们之前学的二级缓存特性,答案很明确,核心就2点:

1. 二级缓存是「跨会话共享」的,需要脱离单个SqlSession的内存

一级缓存是SqlSession级别的,只在当前会话内有效,直接存储Java对象即可——因为同一个会话的内存是连续的,对象可以直接复用。

但二级缓存是Mapper/SqlSessionFactory级别的,需要被多个SqlSession共享(比如会话1查询后,会话2也能用到)。而不同SqlSession的内存是隔离的,无法直接共享Java对象,只能通过“字节数据”这种通用格式,实现跨会话传递和存储。

2. 序列化是二级缓存存储的“前提条件”

MyBatis的二级缓存,本质上是将数据存储在内存(或其他缓存介质)中,而Java对象本身无法直接被缓存存储,必须转换为字节数据才能实现持久化存储(即使是内存缓存,也需要统一的存储格式)。

如果不进行序列化,MyBatis无法将对象存入二级缓存,会直接抛出NotSerializableException异常,二级缓存也无法生效。

三、实操关键:如何实现序列化(MyBatis场景)

结合我们之前开启二级缓存的步骤,实现序列化只需要1步(也是必做的1步):让实体类实现Serializable接口。

正确示例

package com.qcby.mybatis01.model;import java.io.Serializable;// 实现Serializable接口,开启序列化权限
public class User implements Serializable {private Integer id;private String name;private Integer age;// getter、setter、toString方法(省略)
}
}

注意点(避坑必看)

1. Serializable是一个空接口(标记接口),不需要实现任何方法,只需要让实体类“继承”它,就相当于给对象开启了“序列化权限”。

2. 如果实体类有引用其他实体类(比如User关联Order),那么关联的实体类也需要实现Serializable接口,否则会序列化失败。

3. 不实现Serializable的后果:二级缓存无法存储对象,第二次查询会再次执行SQL,缓存失效。

四、序列化/反序列化与二级缓存的完整流程(必背)

结合我们之前写的测试代码,梳理一遍完整流程,帮你串联所有知识点:

  1. SqlSession1(会话1)调用findById(1),查询数据库,得到User对象;

  2. SqlSession1执行close()或commit(),MyBatis自动将User对象序列化(转成字节),存入二级缓存;

  3. SqlSession2(会话2)调用findById(1),先查询二级缓存,找到对应的字节数据;

  4. MyBatis将字节数据反序列化,生成一个全新的User对象;

  5. SqlSession2返回新的User对象,不执行SQL,二级缓存生效。

关键结论:两次查询的User对象地址不同(user == user1 为false),因为第二次是反序列化生成的全新对象。

五、常见误区(新手必避)

误区1:序列化是二级缓存的“额外操作”,可有可无?

错!序列化是二级缓存的核心依赖,没有序列化,二级缓存就无法存储对象,相当于没开启。

误区2:一级缓存也需要序列化?

错!一级缓存存储的是Java对象本身,只在同一个SqlSession内共享,不需要转换为字节,所以不需要实现Serializable接口。

误区3:反序列化生成的对象和原来的对象是同一个?

错!反序列化是重新组装字节,生成的是全新的对象,内存地址不同,但对象的属性值完全一致——这也是二级缓存和一级缓存最直观的区别。

六、总结(极简背诵版)

1. 序列化:对象→字节,用于二级缓存存储;

2. 反序列化:字节→新对象,用于二级缓存读取;

3. MyBatis二级缓存必须让实体类实现Serializable接口,否则缓存失效;

4. 核心目的:实现跨SqlSession共享缓存,减少数据库查询。

其实序列化和反序列化,本质上就是MyBatis为了实现二级缓存跨会话共享,设计的一种“对象存储/读取”方案。结合我们之前写的测试代码,亲自运行一遍,看一下对象地址的差异,就能彻底理解啦!

http://www.jsqmd.com/news/698356/

相关文章:

  • 保姆级教程:用Python+C++复现SGM立体匹配的视差优化全流程(附代码避坑点)
  • 【STM32】STM32实战笔记:独立看门狗与窗口看门狗的配置与调试(47)
  • 软文发稿平台怎么选?选平台必看:高效、靠谱、性价比的判断方法 - 代码非世界
  • 从一次构建失败,聊聊Maven 3.8.1的安全策略升级与你的`.m2/settings.xml`
  • Anime4K终极指南:浏览器中实时观看4K动漫的完整解决方案
  • 2026年贵州高三初三复读与单科学习规划深度评测指南:从基础薄弱到升学突破 - 年度推荐企业名录
  • 2026年贵州高中复读与艺考文化课培训:单科学习规划深度横评指南 - 年度推荐企业名录
  • 3步完成MOOC课程永久保存:MoocDownloader的离线学习解决方案
  • ArcGIS Pro 2.9.5补丁来了!修复符号窗口闪退,附详细安装与回滚指南
  • kali渗透学习教程—web渗透入门使用msf扫描靶机上mysql服务的空密码!
  • 3步解决多显示器窗口混乱:PersistentWindows窗口位置持久化工具终极指南
  • Windows桌面工具箱 滴哦小精灵 v1.5.0
  • 2026年贵州高中初中复读与单科学习规划深度横评:贵阳、安顺、遵义全覆盖指南 - 年度推荐企业名录
  • HyperAgents:基于LLM的AI智能体规划与推理架构深度解析
  • 软件监控管理化的状态检查与告警
  • ThinkPHP代碼審計
  • 3个场景告诉你:为什么你的窗口布局总是混乱?PersistentWindows如何一劳永逸解决问题
  • KUKA iiwa 机器人FRI JAVA编程实战 -- 从官方Demo到自定义控制模式
  • 2026年贵阳、遵义高三初三复读与艺考文化课培训机构深度选择指南 - 年度推荐企业名录
  • 云服务器Samba端口被封?手把手教你用端口映射绕过运营商445限制
  • 告别手速焦虑:biliTickerBuy 开源自动化抢票工具完整指南 [特殊字符]
  • 工业超声波振动筛生产厂家哪家靠谱,河南瑞菲特值得选吗 - myqiye
  • 如何通过PS2EXE将PowerShell脚本编译为可执行文件:终极指南
  • 如何在Adobe Illustrator中实现智能图形分布:Fillinger脚本深度解析
  • 【FPGA技术全景解析】从核心原理到前沿应用
  • 如何5分钟免费创建专业PPT:PPTist在线演示文稿制作完整指南
  • JavaScript事件委托机制在高性能列表开发中的应用
  • 3个技巧:如何用智能插件提升英雄联盟游戏体验
  • 3步解决群晖DSM 7.2.2 Video Station不兼容问题:完整修复指南
  • 说说广州深圳等地信誉好的光纤光缆出口物流机构有哪些靠谱的 - 工业品网