2023版 MyBatis高频面试题 (持续更新中)
一、Mybatis的执行流程
前置知识
读取mybatis核心配置文件:
mybatis-config.xml
主要作用:
- 读取当前环境配置(指定连接的数据库信息)
- 加载sql映射文件
SqlSessionFactory:
会话工厂,生产sqlSession
SqlSession:
项目和数据库的会话,包含了执行sql语句的所有方法,每次操作一个会话,有多个会话
Executor执行器:
真正执行数据库操作的接口,也负责查询缓存的维护
MappedStatement对象:
里面存储这某次查询的信息,读取到mapper映射文件中的标签,id,sql语句等,会将执行sql获得的返回值封装起来。
面试时的回答
- 读取Mybatis配置文件:mybatis-config.xml加载运行环境和映射文件
- 构建会话工厂SqlSessionFactory
- 会话工厂创建SqlSession对象(包含执行SQL语句的所有方法)
- 操作数据库的接口,Executor执行器,同时负责查询缓存的维护
- Executor接口的执行方法中有MappedStatement类型的参数,封装了映射信息
- 输入参数映射
- 输出结果映射
二、Mybatis是否支持延迟加载
前置知识
什么叫做延迟加载?
假设在你的数据库中,有两张表如下:
查询用户时,把用户所属的订单数据也查询出来,这个叫做立即加载
。
查询用户时,暂时不查询订单数据,当需要订单的时候,再查询订单,这个叫做延迟加载。延迟加载—按需加载
延迟加载的原理:
- 使用CGLIB创建目标对象的代理对象
- 当调用目标方法user.getOrderList()时,进入拦截器invoke方法中,发现user.getOrderList()是null值,执行sql查询order列表
- 把order查询上来,然后调用user.setOrderList(List<·Order> orderList)给对应的属性赋值,接着完成user.getOrderList()方法的调用
面试时的回答:
Mybatis是否支持延迟加载?
- 延迟加载的意思是:需要时再对数据进行加载,不需要用到数据时就不加载。
- Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载。
- Mybatis配置文件中,可以配置是否启用延迟加载,
lazyLoadingEnable=true|false
,默认是关闭的;
延迟加载的底层原理是什么?
- 使用CGLIB创建目标对象的代理对象
- 当调用目标方法时,进入拦截器invoke方法,发现目标方法时null,执行sql查询
- 获取数据以后,调用set方法设置属性值,继续查询目标方法,就有值了;