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  学到了这个配置

 

posted @ 2021-12-11 22:46  andrew-chen  阅读(43)  评论(0编辑  收藏  举报