## mybatis 操作流程
1. 根据配置文件名称获取流 inputStream | reader
2. SqlSessionFactoryBuilder 对象根据 inputStream | reader、环境 id 字符串、属性变量构建 SqlSessionFactory 对象
4. SqlSessionFactory 对象开启会话连接 SqlSession
5. SqlSession 会话对象获取 Mapper 对象,直接调用成员方法完成增删改查
## mybatis 解析配置文件流程
1. 根据 inputStream、environment、properties 生成 XMLConfigBuilder 对象
```
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
```
2. XMLConfigBuilder 对象执行解析`parse()` 方法`parser.parse()`获得 Configuration 对象
- 通过 XPath 解析文档获取 configuration 根节点
```
parseConfiguration(parser.evalNode("/configuration"));
```
- 解析 properties 节点信息 `propertiesElement(root.evalNode("properties"));`
1. properties 属性 resource 指定项目根节点下的属性文件
2. properties 属性 url 指定外部地址下的属性文档
3. properties 子元素 property 配置属性键值对
> 注意:resource 和 url 不能同时存在,resource 与 url 中属性变量优先级高于子元素属性键值对,最高优先级的是构建 XMLConfigBuilder 对象时传入的 properties(直接存储在)configuration 对象的 variables 属性中
- 解析 settings 节点信息
- 解析 typeAliases 节点信息 `typeAliasesElement(root.evalNode("typeAliases"));`
1. package 子标签指定需要别名管理的类所在的包路径(此处没有指定每一个类的别名),其每一个类的别名为 Alias 注解标识的名称或者简单类名
2. typeAlias 子标签指定某一类名和其别名(如果没有指定类别名,同上一样为 Alias 注解标识别名或简单类名)
- 解析 plugins 节点信息`pluginElement(root.evalNode("plugins"));`
1. 通过子标签 plugin 的 intercept 属性设置插件的类名(类别名,若为类别名会去别名注册中心去寻找类名)
- 设置 settings 信息 `settingsElement(settings);`, 其中预设了 mybatis 中的诸多配置,若 setting 节点有配置信息,将进行覆盖
- 解析 environments 节点信息 `environmentsElement(root.evalNode("environments"));`
1. 优先检查是否在构建 XMLConfigBuilder 时是否指定环境 id,属性 default 不再生效
2. 遍历子节点,匹配指定环境 id,并构建 Environment 对象,添加到 Configuration 对象中
- 解析 typeHandlers 节点信息 `typeHandlerElement(root.evalNode("typeHandlers"));`,用来处理特殊的 Java 数据类型与数据库中数据类型的转换,mybatis 在此过程中已经预设了很多类型处理,例如String、8大包装类及相应的数组类型、8大基础类型以及相应的数组类型、相应的集合类型、相应的时间类型等...
1. 添加类型处理器时,子标签中 handler 属性指定类型处理器的全类名(类别名)
2. 指定类型处理器要处理的 Java 类型,有两种方式(1. 子标签的 javaType 属性,2. 在类型处理器上定义 MappedTypes 注解)
3. 指定类型处理器要出列的数据库类型,有两种方式(1. 子标签的 jdbcType 属性,2. 在类型处理器上定义 MappedJdbcTypes 注解)
- 解析 mappers 节点信息 `mapperElement(root.evalNode("mappers"));`
1. package 子标签,扫描指定包下的 Mapper
2. mapper 子标签的 resource 属性
3. mapper 子标签的 url 属性
4. mapper 子标签的 class 属性
> 注意:resource、url、class 在一个子标签中不能同时存在,也不能一个也没有。