MyBatis篇
执行流程
- 读取MyBatis配置文件:mybaits-config.xml加载运行环境和配置文件。
- 创建会话工厂SqlSessionFactory。
- 会话工厂创建SqlSession对象。(包含了执行SQL语句的所有方法)。
- 操作数据库的接口,Executor执行器,同时负责查询缓存的维护。
- Executor接口的执行方法中有一个MapperStatement类型的参数,封装了映射信息。
- 输入参数的映射。
- 输出结果的映射。
延迟加载
需要用的时候才加载数据,不需要用到就不加载。
MyBatis支持一对一、一对多关联的延迟加载。
是否支持延迟加载?
支持,但是默认关闭。
全局:全局配置文件中的lazyLoadingEnable=true。
局部:fetchType=lazy。
原理
- 使用
CGLIB创建目标代理对象。 - 当调用getXXX()方法的时候,进入拦截器
invoke方法,判断xxx属性是否为空,如果为则执行sql,从数据库中获取数据 - 获取到数据后,调用setXXX()为xxx属性赋值,接着完成getXXX()方法的调用。
一二级缓存
本地缓存:PerpetualCache,本质是一个HashMap。
一级缓存:作用域是sqlSession级别。
二级缓存:作用域是namespace和mapper的作用域,不依赖sqlSession。
一级缓存
基于PerpetualCache的HashMap的本地缓存,其作用域是sqlSession,当session进行flush或者close之后,该session中的缓存将被清空。默认打开。
二级缓存
默认基于PerpetualCache的HashMap存储,作用域是namespace和mapper。默认是关闭的。
打开步骤
- 全局配置文件:cacheEnable=true。
- mapper文件添加
<cache /。让当前mapper文件生效二级缓存。
注意事项
- 当某个一个作用域(一级缓存Session/二级缓存namespace)进行了新增、修改、删除后,默认清空该作用域下的缓存。
- 二级缓存需要将缓存的数据实现Serializable接口。
- 只有会话提交或者关闭后,一级缓存中的数据才会转移到二级缓存中。
