MyBatis高频面试题

2023版 MyBatis高频面试题 (持续更新中)


一、Mybatis的执行流程

前置知识
读取mybatis核心配置文件:
mybatis-config.xmlmybatis核心配置文件
主要作用:

  • 读取当前环境配置(指定连接的数据库信息)
  • 加载sql映射文件
    在这里插入图片描述

SqlSessionFactory:

会话工厂,生产sqlSession

SqlSession:

项目和数据库的会话,包含了执行sql语句的所有方法,每次操作一个会话,有多个会话

Executor执行器:

真正执行数据库操作的接口,也负责查询缓存的维护

MappedStatement对象:

里面存储这某次查询的信息,读取到mapper映射文件中的标签,id,sql语句等,会将执行sql获得的返回值封装起来。

在这里插入图片描述


面试时的回答

  1. 读取Mybatis配置文件:mybatis-config.xml加载运行环境和映射文件
  2. 构建会话工厂SqlSessionFactory
  3. 会话工厂创建SqlSession对象(包含执行SQL语句的所有方法)
  4. 操作数据库的接口,Executor执行器,同时负责查询缓存的维护
  5. Executor接口的执行方法中有MappedStatement类型的参数,封装了映射信息
  6. 输入参数映射
  7. 输出结果映射

二、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方法设置属性值,继续查询目标方法,就有值了;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值