MyBatis相关面试题
MyBatis相关面试题
1.Mybatis执行流程
读取Mybatis框架核心配置Mybatis-config.xml(数据库原信息/隐射文件)------>会构建一个会话工厂sqlSessionFactory(会话工厂,全局就这一个生产sqlSession)----->创建会话SqlSession(项目与数据库的会话,包含了执行sql语句的所有方法,每次操作一次会话有多个)------->会有一个Executor执行器(真正执行数据库操作接口,也负责查询缓存(一级缓存二级缓存等)的维护)------->里面有一个MappedStatemnet参数封装参数
面试回答
①读取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(List
3.一级缓存二级缓存
本地缓存:基于PerpetualCache本质是一个Hashmap
一级缓存:作用域是session级别的
二级缓存:作用域是namespace和mapper的作用域,不依赖于seeion 默认是关闭的
一级缓存:基于PerpetualCache的Hashmap本地缓存,作用域是Session,当Session进行flsh和close之后,该Seeion中的所有Cache就被清空,默认打开的一级缓存
二级缓存:基于namespace和mapper的作用域,不依赖于SQLSession默认采用的也是PerpetualCached的HashMap存储的 默认是关闭的
-
到全局配置中打开
-
2.到mapper文件中加入
标签
注意事项:二级缓存缓存的数据必须实现Serializable接口 对缓存数据更新之后默认删除缓存