MyBatis进阶版(三)
目录:
1.掌握MyBatis的工作流程
2.掌握MyBatis的架构分层与模块划分
3.掌握MyBatis缓存机制
4.通过阅读MyBatis源码掌握MyBatis底层工作原理与设计思想
一、MyBatis工作流程
1.解析配置文件
首先在MyBatis启动的时候我们要去解析配置文件,包括全局配置文件和映射器配置文件,也就是SQL。它们会被解析成Configuration。
2.提供操作接口
SqlSessionFactory包含了所有的配置文件,通过它提供的builder来创建工厂类SqlSession。注意,它不是SQL的真正执行对象。
3.执行SQL操作
SqlSession持有Executor对象,用来封装对数据库的操作,即是把Statement封装成StatementHandler来处理参数/执行SQL/处理结果集。
image.png
二、MyBatis架构分层与模块划分
image.png
三、MyBatis缓存详解
1.cache缓存
目的:提升查询性能,减少数据库压力。
级别:一级缓存/二级缓存,并且提供集成第三方缓存接口。
额外功能:回收策略、日志记录(命中率)、定时刷新等。
分类:基本缓存、淘汰算法缓存、装饰器缓存。
2.一级缓存
同一个会话里面,SQL一样,直接从内存拿结果。(默认打开)
put:BaseExecutor的query()--queryFromDatabase()中存入
get:query()的时候,先get
clear:同一个会话的insert/update/delete
缺点:跨会话造成脏数据。通过二级缓存解决,它是namespace级别,可以被多个SqlSession共享。
流程:二级缓存拿到结果,就直接返回,否则再到一级缓存,最后到数据库。
3.二级缓存
1)事务不提交,缓存不生效
2)默认关闭
3)使用场景:单表操作。因为不同的namespace(不同表)不共享缓存,跨表操作造成另一个namespace的缓存没有刷新,导致脏数据。
备注:跨namespace缓存可以设置cache-ref。这种情况下,多个Mapper操作都会引起缓存刷新,反而会影响性能,缓存意义不大了。
四、MyBatis源码解读
1.带问题去看,猜想验证
2.学编程风格,设计思想。他的代码为什么这样写,如果不这样写会怎么样?包括接口的定义,类的职责,涉及模式的应用等。
1.配置解析过程
1)建造者模式SqlSessionFactoryBuilder()解析mybatis-config.xml
2)XMLConfigBuilder解析
XMLMapperBuilder:解析Mapper映射器
XMLStatementBUilder:解析增删改查标签
XMLScriptBuilder:解析动态SQL
2.会话创建过程
1)创建执行器
2)缓存装饰
3)插件代理
4)返回SqlSession实现类
3.获取Mapper对象
1)getMapper()返回代理对象
2)直接代理接口。因为Mapper只为找到无Statement ID,在MapperProxy就可以完成,因此无需实现类。
4.执行SQL
1)MapperProxy.invoke(),走缓存,插件拦截。
......
2)创建StatementHandler对象--Statement对象,含四个种插件拦截。
五、Mybatis核心对象
image.png
image.png