01-Mybatis的执行流程
(高频面试题)
第一步:读取Mybatis核心的配置文件
第一个配置的操作:这里指定要操作的数据库,并且输入用户名和密码;
第二个:加载映射文件
两种方式:指定映射文件;指定包名,在这个mapper下面所有的映射文件都会进行加载
第二步:Mybatis通过sql session对象来操作数据库
那么第二步就是创建sql session的对象
会话工厂——它可以批量去生产SqlSession
第三步第四步:
真正操作数据库的是Executor执行器,它维护了一级缓存和二级缓存
第五步:我需要先读取信息才去操作数据库
一个mapper的例子:
定义信息:1、它是一个select标签,也就是查询
2、id,对应mapper接口中的方法的名称
3、resultType,方法的返回值
4、还包含一个sql语句
这些信息,都是由MappedStatement对象进行读取存储的。
第六步:类型转换
先由Java支持的类型转换为数据库类型
最后再转回来
即输入参数映射,输出参数映射
整个执行流程:
02-Mybatis-延迟加载使用及原理
举个例子
1、局部修改——fetchType = "lazy"
2、全局延迟加载
在Mybatis的核心配置文件中,将其注释解开。
延迟加载的实现
面试问题总结:
03-Mybatis-一级、二级缓存
一级缓存的范围只在SqlSession部分
而二级缓存的作用域在命名空间和mapper,不依赖session。
一级缓存
运行结果:
可以发现,第二次查询的时候没有执行sql语句,它是从缓存中直接拿的。
二级缓存
它们属于不同的会话,所以在一级缓存下需要查询两次SQL。
二级缓存开启方式:
注意:
总结:
这里的session.flush() 在commit之前默认都会执行它。
它完成了两件事情:1、清理缓存 2、执行sql