目录

Java面试-MyBatis篇

Java面试-MyBatis篇

一、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接口;会话提交或关闭后,一级缓存数据会转移到二级缓存。