执行流程

  1. 读取MyBatis配置文件:mybaits-config.xml加载运行环境和配置文件。
  2. 创建会话工厂SqlSessionFactory。
  3. 会话工厂创建SqlSession对象。(包含了执行SQL语句的所有方法)。
  4. 操作数据库的接口,Executor执行器,同时负责查询缓存的维护。
  5. Executor接口的执行方法中有一个MapperStatement类型的参数,封装了映射信息。
  6. 输入参数的映射。
  7. 输出结果的映射。

延迟加载

需要用的时候才加载数据,不需要用到就不加载。

MyBatis支持一对一、一对多关联的延迟加载。

是否支持延迟加载?

支持,但是默认关闭。

全局:全局配置文件中的lazyLoadingEnable=true。

局部:fetchType=lazy。

原理

  1. 使用CGLIB创建目标代理对象。
  2. 当调用getXXX()方法的时候,进入拦截器invoke方法,判断xxx属性是否为空,如果为则执行sql,从数据库中获取数据
  3. 获取到数据后,调用setXXX()为xxx属性赋值,接着完成getXXX()方法的调用。

一二级缓存

本地缓存:PerpetualCache,本质是一个HashMap。

一级缓存:作用域是sqlSession级别。

二级缓存:作用域是namespace和mapper的作用域,不依赖sqlSession。

一级缓存

基于PerpetualCache的HashMap的本地缓存,其作用域是sqlSession,当session进行flush或者close之后,该session中的缓存将被清空。默认打开。

二级缓存

默认基于PerpetualCache的HashMap存储,作用域是namespace和mapper。默认是关闭的。

打开步骤

  1. 全局配置文件:cacheEnable=true。
  2. mapper文件添加 <cache /。让当前mapper文件生效二级缓存。

注意事项

  1. 当某个一个作用域(一级缓存Session/二级缓存namespace)进行了新增、修改、删除后,默认清空该作用域下的缓存。
  2. 二级缓存需要将缓存的数据实现Serializable接口。
  3. 只有会话提交或者关闭后,一级缓存中的数据才会转移到二级缓存中。

流式查询