执行流程
- 读取配置文件
mybatis-config.xml
, 获取数据库相关参数 - 构建会话工厂
SqlSessionFactory
, 全局一个, 用于生产SqlSession
- 创建会话
SqlSession
, 包含执行 sql 语句的所有方法, 每次操作一次会话, 有多个 Executor
执行器, 执行数据库操作的接口, 也负责查询缓存的维护Executor
中有一个MappedStatement
对象, 封装类型映射信息. 执行前将 java 的数据类型转换成数据库类型, 执行后将数据库类型转换成 java 类型- 查询数据库
延迟加载
延迟加载: 查询时一个类的有些属性先不查询, 有需要的时候再查询加载
默认不使用延迟加载, 在 mapper 文件中设置fetchType="lazy"
/在配置文件中配置lazyLoadingEnabled=true
开启. 开启后当访问orderList
属性时再执行这个属性的查询.
延迟加载原理:
一级和二级缓存
本地缓存, 基于 PerpetualCache
, 本质上是一个 HashMap
- 一级缓存: 作用域时 sqlSession 级别, 当 sqlSession 进行 flush/close 后清空, 默认打开一级缓存
- 二级缓存: 作用域时 namespace 和 mapper 的作用域, 不依赖于 sqlSession, 使用
cacheEnabled=true
并在 mapper 文件中添加<cache/>
标签打开二级缓存
注意:
- 当某一个作用域进行了数据修改操作时, 默认该作用域下所有缓存被清空
- 二级缓存需要缓存的数据要实现
Serializable
接口 - 会话提交或关闭后, 一级缓存中的数据才会转移到二级缓存中