执行流程

  1. 读取配置文件 mybatis-config.xml, 获取数据库相关参数
  2. 构建会话工厂 SqlSessionFactory, 全局一个, 用于生产SqlSession
  3. 创建会话 SqlSession, 包含执行 sql 语句的所有方法, 每次操作一次会话, 有多个
  4. Executor 执行器, 执行数据库操作的接口, 也负责查询缓存的维护
  5. Executor 中有一个 MappedStatement 对象, 封装类型映射信息. 执行前将 java 的数据类型转换成数据库类型, 执行后将数据库类型转换成 java 类型
  6. 查询数据库

延迟加载

延迟加载: 查询时一个类的有些属性先不查询, 有需要的时候再查询加载

默认不使用延迟加载, 在 mapper 文件中设置fetchType="lazy"/在配置文件中配置lazyLoadingEnabled=true开启. 开启后当访问orderList属性时再执行这个属性的查询.

延迟加载原理:

一级和二级缓存

本地缓存, 基于 PerpetualCache, 本质上是一个 HashMap

  • 一级缓存: 作用域时 sqlSession 级别, 当 sqlSession 进行 flush/close 后清空, 默认打开一级缓存
  • 二级缓存: 作用域时 namespace 和 mapper 的作用域, 不依赖于 sqlSession, 使用cacheEnabled=true 并在 mapper 文件中添加<cache/>标签打开二级缓存

注意:

  • 当某一个作用域进行了数据修改操作时, 默认该作用域下所有缓存被清空
  • 二级缓存需要缓存的数据要实现Serializable接口
  • 会话提交或关闭后, 一级缓存中的数据才会转移到二级缓存中