最近一直在折腾sharding-jdbc,遇到不少性能相关问题,为了更清晰的了解问题所在,trace了不少源码。
借此机会,对mybatis的源码进行解析,本篇只做简要的介绍。
一. 概念介绍
1.1 组件介绍
-
Configuration
配置信息,包含Mybatis大部分配置信息(ALL IN ONE)
结构:
- Environment
- TransactionFactory 事务工厂
- DataSource 数据源
- Mapper注册信息
- 拦截器信息
- 配置信息
- …
- Environment
-
SqlSessionFactory
创建SqlSession
-
SqlSession
与Mybatis交互的主要接口,提供语句执行、事务管理及映射器(Mapper)获取的接口
1.2 执行流程
语句执行流程:
-
生成Configuration (SqlSessionFactoryBuilder解析xml构建)
# SqlSessionFactoryBuilder line 47 public SqlSessionFactory build(Reader reader, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties); return build(parser.parse()); // 这里进行生成configuration } catch (Exception e) { ... } finally { ... } }
# XMLConfigBuilder line:94 public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; parseConfiguration(parser.evalNode("/configuration")); return configuration; }
-
基于Configuration构建SqlSessionFactory
# SqlSessionFactoryBuilder line:91 public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
-
SqlSessionFactory生成SqlSession
调用
openSession
方法,获取SqlSession -
SqlSession执行语句
SqlSession定义了许多数据操作的方法,底层实现则交由对应的Executor执行,并返回结果集
1.3 核心模块
-
配置解析
对xml进行解析,并转化为对应的对象信息。如
mybatis-config.xml
解析为配置类Configuration
-
反射
对于ORM,需要经常对类的属性、对象的成员、方法进行判断赋值。而Mybatis则提供了反射模块来支持ORM的这个特性
-
对象映射/绑定
负责jdbcType与java类之间的转化
-
语句执行
语句执行包含几个子流程
- SQL解析
- SQL执行
- 返回结果
-
数据源管理
- 池化数据源 PooledDataSource
- 普通数据源 UnpooledDataSource
-
事务管理
-
插件
Mybatis支持自定义插件,对流程进行调整干预
-
日志
支持不同类型的日志实现