Mybatis源码阅读 小记
要阅读Mybatis代码,先从逻辑上来分层。
逻辑上可以分为三层:接口层、核心层、基础层。
接口层即对外暴露的接口,包括操作DB、配置。
核心层即框架内部主要流程设计的核心概念,参照一条SQL查询的流程,包括配置解析、参数映射、SQL执行、结果映射。
基础层是支撑 实现核心概念的组件,包括 日志、网络IO、缓存、连接池、事务、反射。
12.11
阅读两处源码:
org.mybatis.spring.SqlSessionFactoryBean#buildSqlSessionFactory
XMLConfigBuilder, XMLMapperBuilder 组合起来构建 Configuration, 并构建Mapper。其中 statement的构建委托给了XMLStatementBuilder。
知识点:Builder模式。 组合模式。
org.apache.ibatis.builder.xml.XMLStatementBuilder#parseStatementNode
知识点:将相关对象封装在Context(即一个XNode), 传递给XMLStatementBuilder来构建
JDK8用法:Optional.ofNullable(obj).isifPresent(method::reference)
12.29
继续读代码,这次涉及到了SQL执行,主要看了Executor 及其继承子类。
顺带复习了一把,事务隔离级别。读未提交,读已提交,可重复度,串行。
2022.1.4
新年继续读源码。
org.apache.ibatis.binding.MapperRegistry#getMapper。从SqlSession.getMapper看起, 重温了JDK动态代理。
SqlSessionFactory, SqlSessionFactoryBuilder, SqlSession的关系。
SqlSession里重要的API。
2022.1.7
跟着官方文档看了下XML映射器 ResultMap,号称是Mybatis的强大功能,能够处理复杂的结果映射。
但一般的应用不会搞很复杂的查询逻辑,而是分多次把要的结果查出来,这样的代价是多次的IO网络开销。不过一般云应用和DB都会在内网,连接很快问题不大。
嵌套的结果映射(查出博客以及关联的作者 association 关联 查出博客以及对应评论 collection 集合)包含两种:
第一种可能会导致N+1的性能问题,尽管支持了延迟加载。
第二种直接以嵌套结果映射来满足需求。
2022.1.17
1. 阅读配置解析的代码,在org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration中按次序 解析了properties, settings, typeAliases, plugins等十多种不同配置。
今天主要看了properties 和 environments。
properties的解析支持 ${TOKEN} 样式的占位符替换,支持默认值,具体在org.apache.ibatis.parsing.PropertyParser中实现。 这里启发思路:业务代码里涉及占位符替换,也可以参考这种实现方式。
2. 另Mybatis3测试代码连接的是一个叫Apache Derby的嵌入式DB,很方便,学到了。
3. Configuration.AutoMappingUnknownColumnBehavior 学到了这个配置