Mybatis源码阅读-笔记

整体流程

1. SqlSessionFactoryBuilder: 建造者模式根据提供的配置源创建SqlSessionFactory(其中包含xml解析成通用Configuration,mapper解析成MapperStatment)
2. SqlSessionFactory: 创建一个sql连接
3. sqlSessionFactory.openSession(): 创建连接其中包含Executor(执行器)、Transaction(连接)
4. SqlSession: mybatis执行数据库操作的主要入口

在这里插入图片描述

SqlSession

源码定义如下

使用MyBatis的主要Java接口。
通过这个接口,您可以执行命令,获取mapper和管理事务。

其中包括了几个核心:

可以看出Transaction封装了JDBC Connection,Executor封装了CURD入口

Transaction

数据库连接操作核心生命周期操作:

  1. 开启连接
  2. 关闭连接
  3. commit
  4. rollback
  5. close

JdbcTransaction 实现中,连接池也在其中

Executor

主要功能

  1. 在Transaction的基础上提供了主要的数据库操作,包括查询等;
  2. 动态代理织入插件;

执行器类型:

  1. SIMPLE: 它只为每个语句创建一个PreparedStatement。可以返回自增键,自增键会在事务提交后,自动设置到传入的对象中。
  2. REUSE: SIMPLE的基础上重复使用PreparedStatements;
  3. BATCH: 批量更新,性能更优,无法直接获取自增id,一批共享一个事务;
  4. CACHE: 对上三种类型的扩展(装饰模式),二级缓存;
多级缓存

先查询二级缓存,二级缓存中无对应数据,再去查询一级缓存,一级缓存中也没有,最后去数据库查找。

一级缓存

一级缓存作用域是sqlsession级别的,同一个sqlsession中执行相同的sql查询(相同的sql和参数),第一次会去查询数据库并写到缓存中,第二次从一级缓存中取。

一级缓存是基于 PerpetualCache 的 HashMap 本地缓存,默认打开一级缓存。

何时清空一级缓存
如果中间sqlSession去执行commit操作(执行插入、更新、删除),则会清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。

二级缓存

二级缓存是 mapper 映射级别的缓存,多个 SqlSession 去操作同一个 Mapper 映射的 sql 语句,多个SqlSession 可以共用二级缓存,二级缓存是跨 SqlSession 的。

二级缓存何时存入
在关闭sqlsession后(close),才会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。

开启了二级缓存后,还需要将要缓存的pojo实现Serializable接口,为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一定只存在内存中,有可能存在硬盘中。

二级缓存有过期时间,但没有后台线程进行检测
需要注意的是,并不是key-value的过期时间,而是这个cache的过期时间,是flushInterval,意味着整个清空缓存cache,所以不需要后台线程去定时检测。

基础概念
  1. 非事务情况下,每个数据库操作创建一个sqlsession;
  2. 全局共享Configuration,数据库连接池也在其中,故不会因为创建Session重复创建连接池;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值