MyBatis相关面试题

MyBatis相关面试题

1.Mybatis执行流程

读取Mybatis框架核心配置Mybatis-config.xml(数据库原信息/隐射文件)------>会构建一个会话工厂sqlSessionFactory(会话工厂,全局就这一个生产sqlSession)----->创建会话SqlSession(项目与数据库的会话,包含了执行sql语句的所有方法,每次操作一次会话有多个)------->会有一个Executor执行器(真正执行数据库操作接口,也负责查询缓存(一级缓存二级缓存等)的维护)------->里面有一个MappedStatemnet参数封装参数
image-20250816203203064

面试回答

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

2.Mybatis是否支持延迟加载

支持延迟加载,需要用导数据再加载不需要就不加载 但是默认没有开启 用fetchType="lazy"来设置
还可以设置全局的延迟加载 使用的是代理对象来实现的延迟加载
实现原理
1.使用CGLIB创建目标对象的代理对象
2.当调用目标方法user.aetOrderlist0时,进入拦截器invoke方法,发现user.getOrderlist0是nul值,执行sal查询order列表
3.把order查询上来,然后调用user.setOrderList(ListorderList),接着完成user.getOrderlist()方法的调用

image-20250816204416841

3.一级缓存二级缓存

本地缓存:基于PerpetualCache本质是一个Hashmap
一级缓存:作用域是session级别的
二级缓存:作用域是namespace和mapper的作用域,不依赖于seeion 默认是关闭的

一级缓存:基于PerpetualCache的Hashmap本地缓存,作用域是Session,当Session进行flsh和close之后,该Seeion中的所有Cache就被清空,默认打开的一级缓存

二级缓存:基于namespace和mapper的作用域,不依赖于SQLSession默认采用的也是PerpetualCached的HashMap存储的 默认是关闭的

  1. 到全局配置中打开

  2. 2.到mapper文件中加入标签

注意事项:二级缓存缓存的数据必须实现Serializable接口 对缓存数据更新之后默认删除缓存

posted @ 2025-08-16 21:14  重生在二本学java  Views(8)  Comments(0)    收藏  举报