一、MyBatis执行流程:
- 读取核心配置文件:包含运行环境配置(指定操作数据库、用户名和密码)和加载映射文件(可指定单个文件或扫描包)。
- 构建会话工厂:SQL Session Factory全局只有一个,用于创建多个SQL Session对象,SQL Session包含执行SQL语句的方法。
- 执行器操作:Executor执行器封装JDBC操作,维护一级和二级缓存。
- Mapper Statement对象:封装Mapper接口映射文件中标签的信息,如查询类型、方法名、返回值、SQL语句等。
- 参数与结果类型转换:将Java参数类型转换为数据库支持的类型进行操作,操作完成后再将数据库类型转换为Java类型。
二、MyBatis延迟加载:
- 定义与示例:延迟加载即按需加载,如查询用户时暂不查询订单,需要订单时再查询。以用户表和订单表一对多关系为例进行演示。
- 配置方式:可在核心配置文件中设置lazy loading enable为true开启全局延迟加载,也可在映射文件中添加fetch type=lazy进行局部开启。
- 底层原理:使用CGLIB创建目标对象的代理对象,调用目标方法时进入代理对象的invoke方法,判断属性是否为空,为空则执行SQL查询并封装结果。
三、MyBatis一级和二级缓存:
- 缓存基本原理:请求先判断是否命中缓存,命中则直接返回数据,未命中则查询数据库并将数据存入缓存后返回。
- 一级缓存:基于本地缓存(本质是哈希map),作用域是SQL Session,默认打开,session刷新或关闭后缓存清空。同一session多次查询相同数据,仅第一次执行SQL。
- 二级缓存:基于命名空间和Mapper作用域,不依赖SQL Session,默认关闭。开启需在全局配置文件设置cache enable为true,在映射文件中添加cache标签。开启后不同session查询相同数据可命中缓存。
- 注意事项:增删改操作会清空一级和二级缓存;二级缓存数据需实现Serializable接口;会话提交或关闭后,一级缓存数据会转移到二级缓存。