mybatis 一级缓存和二级缓存相关源码

mybatis简介

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. 
MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. 
MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.

debug版本:mybatis:3.4.5

自我理解

mybatis代理Dao类,当运行Dao中方法时,根据方法查找相应的sql,然后去执行sql,来提供返回值。

初始化

一级缓存和二级缓存

程序主函数

811852-20190419165912290-2071336989.png

因为mybatis采用的JDK反向代理,来代理Dao类。如果你想看代理Dao类具体实现,可以用一下方式

# idea打断点,查找运行java程序的pid
# 管理员身份运行jdk中sa-jdi.jar 主函数sun.jvm.hotspot.HSDB,来attach 那个pid
# 就可以查看Java程序运行到断点处的状态了,查找代理类
# JDK代理方法,命名为 $Proxy + 数字,不好查找,可以在断点前,输出代理类的名字
sudo java -classpath './jdk1.8.0_172/lib/sa-jdi.jar' sun.jvm.hotspot.HSDB

代理Dao类,主要运行了MapperProxy.invoke方法

811852-20190419165929260-2061575240.png

Object.class.equals(method.getDeclaringClass()) 用来判断是否调用的是Object.class中方法,

isDefaultMethod(method) 用来判断是否是Java8中Interface 中新特性default修饰的方法,

MapperProxy.invoke

MapperMethod.execute

判断执行的是insert,update,delete,select,flush中的哪一个,insert,update,delete返回的都是影响的行数,select才需要特殊处理返回数据,至于flush是执行有@Flush注解的方法是才去执行。

811852-20190419165947493-327521158.png

CachingExecutor.query

mybatis的二级缓存,缓存在Configuration中。

二级缓存是默认关闭的,设置需要在Mapper XML中添加cache配置。

二级缓存的返回是一个NameSpace 下一个缓存

811852-20190419165958750-2009698896.png

BaseExecutor.query

mybatis一级缓存,缓存在SqlSession中。

一级缓存是默认的,不需要配置,localCache中没有缓存时,才去执行queryFromDatabase方法,去查询数据库,并将结果缓存到localCache中。

811852-20190419170006910-1711396432.png

返回数据处理

转载于:https://www.cnblogs.com/myblog-2015/p/10737049.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值