一.缓存总览 Mybatis在设计上处处都有用到的缓存,而且Mybatis的缓存体系设计上遵循单一职责.开闭原则.高度解耦.及其精巧,充分的将缓存分层,其独到之处可以套用到很多类似的业务上.这里将主要的缓存体系做一下简单的分析笔记.以及借助Mybatis缓存体系的学习,进一步窥探责任链派发模式企业级实践,以及对象循环依赖场景下如何避免装载死循环的企业级解决方案. 先来一张之前的执行体系图: 对照这张执行图,不难看出,其实对于一次Mybatis查询调用,即SqlSession -> SimpleE…
1. 前言 前面近一个月去写自己的mybatis框架了,对mybatis源码分析止步不前,此文继续前面的文章.开始分析mybatis一,二级缓存的实现.附上自己的项目github地址:https://github.com/xbcrh/simple-ibatis 对mybatis感兴趣的同学可关注下,全手写的一个orm框架,实现了sql的基本功能和对象关系映射.废话不说,开始解析mybatis缓存源码实现. 2. mybatis中缓存的实现方式 见mybatis源码包 org.apache.iba…
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空. 2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如…
一.mybatis的缓存 一级缓存:sqlsession级别,默认开启(一个事务内有效)二级缓存:  sqlsessionFactory级别,需要手动开启,在xml配置cache节点(依赖事务的执行结果,对缓存进行刷新) 二.mybatis的缓存流程示意图…
今天将Mybatis的执行器部分做一下简单手记. 一.java原生JDBC 众所周知,Mybatis是一个半自动化ORM框架.其实说白了,就是将java的rt.jar的JDBC操作进行了适度的封装.所以落到根本,肯定离不开JDBC的基本操作.我们来一起复习一下JDBC的基本操作.这里以java.sql.PreparedStatement为例. public void jdbcTest() throws SQLException { // 1.获取连接 connection = DriverMan…
MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相同的查询语句,完全可以把查询结果存储起来,下次查询同样的内容的时候直接从内存中获取数据即可,这样在某些场景下可以大大提升查询效率. MyBatis的缓存分为两种: 一级缓存,一级缓存是SqlSession级别的缓存,对于相同的查询,会从缓存中返回结果而不是查询数据库 二级缓存,二级缓存是Mapper…
1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然也在内部提供了相应的支持.通过在框架层面增加缓存功能,可减轻数据库的压力,同时又可以提升查询速度,可谓一举两得.MyBatis 缓存结构由一级缓存和二级缓存构成,这两级缓存均是使用 Cache 接口的实现类.因此,在接下里的章节中,我将首先会向大家介绍 Cache 几种实现类的源码,然后再分析一级和…
一:Cache类的介绍 讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(ServiceProvider Interface) ,所有的MyBatis内部的Cache缓存,都应该实现这一接口 Cache的实现类中,Cache有不同的功能,每个功能独立,互不影响,则对于不同的Cache功能,这里使用了装饰者模式实现. 看下cache的实现类,如下图: 1.FIFOCache:先进…
本文主要是个人学习mybatis缓存的学习笔记,主要有以下几个知识点 1.一级缓存配置信息 2.一级缓存源码学习笔记 3.二级缓存配置信息 4.二级缓存源码 5.一级缓存.二级缓存总结 1.一级缓存配置: 一级缓存是SqlSession级别的,同一个sqlSession执行多次相同的查询语句时,第二次会从缓存中获取数据,不查询数据库:一级缓存是无法关闭的,默认是SESSION级别 mybatis一级缓存默认是开启的,一级缓存有两个配置值,SESSION级别和STATEMENT级别,这两个级别的区…
上一篇整合redis框架作为mybatis的二级缓存, 该篇从源码角度去分析mybatis是如何做到的. 通过上一篇文章知道,整合redis时需要在FemaleMapper.xml中添加如下配置 <cache eviction="LRU" type="qinfeng.zheng.RedisCache"/> MYBATIS源码分析之02配置文件解析  这篇文章讲解了mybatis解析配置文件具体的过程. 这里再总结一下,mybatis解析主配置文件使用了X…
前言 大家好,这一篇文章是MyBatis系列的最后一篇文章,前面两篇文章:手把手带你阅读Mybatis源码(一)构造篇 和 手把手带你阅读Mybatis源码(二)执行篇,主要说明了MyBatis是如何将我们的xml配置文件构建为其内部的Configuration对象和MappedStatement对象的,然后在第二篇我们说了构建完成后MyBatis是如何一步一步地执行我们的SQL语句并且对结果集进行封装的. 那么这篇作为MyBatis系列的最后一篇,自然是要来聊聊MyBatis中的一个不可忽视的…
上一章分析了mybatis的源码的日志模块,像我们经常说的mybatis一级缓存,二级缓存,缓存究竟在底层是怎样实现的.此次开始分析缓存模块 1. 源码位置,mybatis源码包位于org.apache.ibatis.cache下,如图 2. 先从org.apache.ibatis.cache下的cache接口开始 // 缓存接口 public interface Cache { // 获取缓存ID String getId(); // 放入缓存 void putObject(Object ke…
之前写了一篇关于mybatis缓存的读后感,想了想还是把缓存模块简单分析一下,附赠下载地址:https://github.com/MyBatis/MyBatis-3,github直接搜排名很靠前的. 先看一张缓存源码包图片: 其实看到这个包,大致可以猜出decorators是装饰器,Cache是缓存的抽象,PerpetualCache类是缓存的具体实现,TransactionalCacheManager应该是关于事务的处理,带着这些猜测首先看下Cache类的源码实现: 可以看到里面都是关于缓存的…
Mybatis源码研究7:缓存的设计和实现 2014年11月19日 21:02:14 酷酷的糖先森 阅读数:1020   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014723529/article/details/41288565 一.包概述(org.apache.ibatis.cache) 本包包含了Mybatis框架的缓存接口的定义和实现.    本包只引用了Mybatis的io包的Resources,不依赖于任何第三方库.    …
目录 零.一级缓存和二级缓存的流程 一级缓存总结 二级缓存总结 一.缓存接口Cache及其实现类 二.cache标签解析源码 三.CacheKey缓存项的key 四.二级缓存TransactionCache 五.二级缓存测试 六.一级缓存源码解析 七.测试一级缓存 前文传送门:mybatis源码学习:从SqlSessionFactory到代理对象的生成 零.一级缓存和二级缓存的流程 以这里的查询语句为例. 一级缓存总结 以下两种情况会直接在一级缓存中查找数据 主配置文件或映射文件没有配置二级缓存…
这是昨晚的武汉,晚上九点钟拍的,疫情又一次来袭,曾经熙熙攘攘的夜市也变得冷冷清清,但比前几周要好很多了.希望大家都能保护好自己,保护好身边的人,生活不可能像你想象的那么好,但也不会像你想象的那么糟. 好了,言归正传,搞技术的努力提升技术才是王道. 这是Mybatis 源码解析第三篇文章 ①.Mybatis 源码解析1--从JDBC到Mybatis ②.Mybatis 源码解析2--从0到1实例搭建 在上一篇文章<Mybatis从0到1实例搭建>中,可乐给大家手撸了一遍如何通过 Mybatis…
* 本文速览 本篇文章较为详细的介绍了 MyBatis 执行 SQL 的过程.该过程本身比较复杂,牵涉到的技术点比较多.包括但不限于 Mapper 接口代理类的生成.接口方法的解析.SQL 语句的解析.运行时参数的绑定.查询结果自动映射.延迟加载等.本文对所列举的技术点,以及部分未列举的技术点都做了较为详细的分析.全文篇幅很大,需要大家耐心阅读.下面来看一下本文的目录: 源码分析类文章通常比较枯燥.因此,我在分析源码的过程中写了一些示例,同时也绘制了一些图片.希望通过这些示例和图片,帮助大家理解…
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来,独立成文,于是就有了本篇文章.在本篇文章中,我将分析映射文件中出现的一些及节点,比如 <cache>,<cache-ref>,<resultMap>, <select | insert | update | delete> 等.除了分析常规的 XML 解析过程外…
Mybatis源码解析(二) -- 加载 Configuration    正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config.xml 以及 mapper.xml 中的所有信息 都可以在 Configuration 对象中获取到.所以一般情况下,Configuration 对象只会存在一个.通过上篇文章我们知道了mybatis-config.xml 和 mapper.xml 分别是通过 XMLConfigBuilder 和…
今Executor这个类,Mybatis虽然表面是SqlSession做的增删改查,其实底层统一调用的是Executor这个接口 在这里贴一下Mybatis查询体系结构图 Executor组件分析 Executor是Mybatis的核心组件之一,定义了数据库操作最基本的方法,SqlSession的功能都是基于它实现的; 在分析这个之前先来说一下 大家不用想也知道 设计模式白,之前都是这么开始讲的,没错在这里我说一下模板模式 模板模式:一个抽象类公开定义了执行他方法的方式/模板,他的子类可以按需要…
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录.如何新建MyBatis源码工程请点击MyBatis源码分析-IDEA新建MyBatis源码工程. MyBatis框架主要完成的是以下2件事情: 根据JD…
@(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该数据源对于每次获取请求都简单的打开和关闭连接.PooledDataSource,该数据源在Unpooled的基础上构建了连接池. UnpooledDataSource 配置 UNPOOLED数据源只有5个属性需要配置: driver:JDBC具体数据库驱动 url:JDBC连接 username:用…
@(MyBatis)[Cache] MyBatis源码分析--Cache接口以及实现 Cache接口 MyBatis中的Cache以SPI实现,给需要集成其它Cache或者自定义Cache提供了接口. public interface Cache { String getId(); void putObject(Object key, Object value); Object getObject(Object key); Object removeObject(Object key); voi…
示例代码 之前的文章说过,对于MyBatis来说insert.update.delete是一组的,因为对于MyBatis来说它们都是update:select是一组的,因为对于MyBatis来说它就是select. 本文研究一下select的实现流程,示例代码为: public void testSelectOne() { System.out.println(mailDao.selectMailById(8)); } selectMailById方法的实现为: public Mail sele…
知识储备 SqlsessionFactory-mybatis持久层操作数据的根本,具体的解析是通过SqlSessionFactoryBean生成的,具体的形成可见>>>Spring mybatis源码篇章-SqlSessionFactoryBean MapperInterface-mybatis的java接口类,用于service/controller层的调用,具体的解析是通过MapperScannerConfigurer扫描接口并封装成MapperFactoryBean来注册生成,可见…
根据前文Mybatis源码分析-SqlSessionTemplate的简单分析,对于SqlSession的CURD操作都需要经过Executor接口的update/query方法,本文将分析下BaseExecutor如何解析执行sql语句 BaseExecutor-抽象类 其是Executor接口的实现类但为抽象类,另外一个则为具体实现类为CachingExecutor,主要是通过对象适配的设计模式在原来的executor上再附上缓存的属性,有兴趣的可自行查阅.先从构造函数看一发 protect…
承接Mybatis源码解析-MapperRegistry注册mapper接口,本文将在前文基础上讲解持久层的生成 SqlSessionFactory生成 在spring中,SqlSessionFactory的生成是通过SqlSessionFactoryBean生成的,如下 protected SqlSessionFactory buildSqlSessionFactory() throws IOException { **** **** return this.sqlSessionFactory…
两个很有名的持久层hibernate和mybatis应该很熟悉不过了,两者最大相同点是底层都是对jdbc的封装,最大的不同点是前者是自动生成sql语句,后者是需要我们在映射文件中写出sql. 其实从以前就一直想看看mybatis源码的,由于自己太懒了就一直拖了下来,最近没啥事,就看看源码吧! 都说mybatis是对jdbc的封装当然,那到底是怎么封装的呢?眼见为实!还是跟以前一样,如果只看mybatis有点不过瘾,于是我们就顺便从最基本的jdbc开始看起! 1.简单看看JDBC JDBC大家应该…
工具除了会用,还应该多做点.我觉得使用一个软件工具(开源类),一般会经历几个步骤: 1. 通过wiki了解大致作用,然后开始码代码: 2. 系统性地学习其特性,找出可能需要的点,用上去: 3. 通过阅读其源码,清楚其来龙去脉: 4. 有能力你就去超越别人: mybatis作为orm框架给我们带来了很多方便,其定制功能也让我们惊喜!还是来看看别人怎么做到的吧! 1. 下载git仓库, https://github.com/mybatis/mybatis-3 2. 打开IDE, 找到 test 包…
知识储备 SqlsessionFactory-mybatis持久层操作数据的前提,具体的解析是通过SqlSessionFactoryBean生成的,可见>>>Spring mybatis源码篇章-SqlSessionFactoryBean MapperInterface-mybatis的java接口类,用于service/controller层的调用,具体的解析可见>>>Spring mybatis源码篇章-MapperScannerConfigurer关联dao接口…