没有合适的资源?快使用搜索试试~ 我知道了~
MyBatis个人分析笔记,包括mapper,sql解析,sqlSession执行,缓存实现,语句statement处理,结果result处理等
资源推荐
资源详情
资源评论
Mybatis 缓存特性的使用及源码分析
前言
主题是 Mybatis 一级和二级缓存的应用及源码分析。希望在本场 chat 结束后,
能够帮助读者朋友明白以下三点。
1. Mybatis 是什么。
2. Mybatis 一级和二级缓存如何配置使用。
3. Mybatis 一级和二级缓存的工作流程及源码分析。
为达到以上三个目的,本文按照以下顺序展开。
Mybatis 的基础概念。
一级缓存介绍及相关配置。
一级缓存工作流程及源码分析。
一级缓存总结。
二级缓存介绍及相关配置。
二级缓存源码分析。
二级缓存总结。
全文总结。
Mybatis 的基础概念
本章节会对 Mybatis 进行大体的介绍,分为官方定义和核心组件介绍。
首先是 Mybatis 官方定义,如下所示。
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免
了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生
Map 使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的
Java 对象)映射成数据库中的记录。
其次是 Mybatis 的几个核心概念。
1. SqlSession : 代表和数据库的一次会话,向用户提供了操作数据库的方法。
2. MappedStatement: 代表要发往数据库执行的指令,可以理解为是 Sql 的抽象表
示。
3. Executor: 具体用来和数据库交互的执行器,接受 MappedStatement 作为参数。
4. 映射接口: 在接口中会要执行的 Sql 用一个方法来表示,具体的 Sql 写在映射文
件中。
5. 映射文件: 可以理解为是 Mybatis 编写 Sql 的地方,通常来说每一张单表都会对
应着一个映射文件,在该文件中会定义 Sql 语句入参和出参的形式。
下图就是一个针对 Student 表操作的接口文件 StudentMapper,在
StudentMapper 中,我们可以若干方法,这个方法背后就是代表着要执行的
Sql 的意义。
通常也可以把涉及多表查询的方法定义在 StudentMapper 中,如果查询的主体
仍然是 Student 表的信息。也可以将涉及多表查询的语句单独抽出一个独立的
接口文件。
在定义完接口文件后,我们会开发一个 Sql 映射文件,主要由 mapper 元素和
select|insert|update|delete 元素构成,如下图所示
mapper 元素代表这个文件是一个映射文件,使用 namespace 和具体的映射接
口绑定起来,namespace 的值就是这个接口的全限定类名。select|insert|
update|delete 代表的是 Sql 语句,映射接口中定义的每一个方法也会和映射文
件中的语句通过 id 的方式绑定起来,方法名就是语句的 id,同时会定义语句的
入参和出参,用于完成和 Java 对象之间的转换。
在 Mybatis 初始化的时候,每一个语句都会使用对应的 MappedStatement 代表,
使用 namespace+语句本身的 id 来代表这个语句。如下代码所示,使用
mapper.StudentMapper.getStudentById 代表其对应的 Sql。
SELECT id,name,age FROM student WHERE id = #{id}
在 Mybatis 执行时,会进入对应接口的方法,通过类名加上方法名的组合生成
id,找到需要的 MappedStatement,交给执行器使用。 至此,Mybatis 的基础
概念介绍完毕。
一级缓存
一级缓存介绍
在系统代码的运行中,我们可能会在一个数据库会话中,执行多次查询条件完
全相同的 Sql,鉴于日常应用的大部分场景都是读多写少,这重复的查询会带
来一定的网络开销,同时 select 查询的量比较大的话,对数据库的性能是有比
较大的影响的。
如果是 Mysql 数据库的话,在服务端和 Jdbc 端都开启预编译支持的话,可以在
本地 JVM 端缓存 Statement,可以在 Mysql 服务端直接执行 Sql,省去编译 Sql
的步骤,但也无法避免和数据库之间的重复交互。关于 Jdbc 和 Mysql 预编译缓
存的事情,可以看我的这篇博客 JDBC
和
Mysql
那些事 。
Mybatis 提供了一级缓存的方案来优化在数据库会话间重复查询的问题。实现
的方式是每一个 SqlSession 中都持有了自己的缓存,一种是 SESSION 级别,
即在一个 Mybatis 会话中执行的所有语句,都会共享这一个缓存。一种是
STATEMENT 级别,可以理解为缓存只对当前执行的这一个 statement 有效。
如果用一张图来代表一级查询的查询过程的话,可以用下图表示。
每一个 SqlSession 中持有了自己的 Executor,每一个 Executor 中有一个 Local
Cache。当用户发起查询时,Mybatis 会根据当前执行的 MappedStatement 生
成一个 key,去 Local Cache 中查询,如果缓存命中的话,返回。如果缓存没
有命中的话,则写入 Local Cache,最后返回结果给用户。
一级缓存配置
上文介绍了一级缓存的实现方式,解决了什么问题。在这个章节,我们学习如
何使用 Mybatis 的一级缓存。只需要在 Mybatis 的配置文件中,添加如下语句,
就可以使用一级缓存。共有两个选项,SESSION 或者 STATEMENT,默认是
SESSION 级别。
剩余55页未读,继续阅读
资源评论
普通网友
- 粉丝: 224
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功