1.2 启动过程中,Mapper.xml的解析
整体流程
简易流程图
整体流程解析引用类缓存解析当前类缓存扫描器进行扫描解析入参映射关系解析出参映射关系解析SQL代码块解析SQL执行语句解析SQL节点结束
文本描述
- 启动时会初始化XMLMapperBuilder对象
- 内部构建XPathParser
- 进行解析
- 解析引用类缓存(cache-ref节点) cacheRefElement
- 解析当前类缓存(cache节点) cacheElement
- Configuration在构建过程中会在typeAliasRegistry的TYPE_ALIASES赋值
- 解析入参映射关系(/mapper/parameterMap 节点)parameterMapElement
- 解析出参映射关系(/mapper/resultMap 节点)resultMapElements
- 处理构造函数节点
- 构建ResultMapping属性
- 解析discriminator(鉴频器)
- 解析SQL代码块(/mapper/sql 节点) sqlElement
- 解析SQL执行语句() buildStatementFromContext 解析
- 解析SQL节点(select|insert|update|delete节点
- 解析SelectKeyNodes processSelectKeyNodes
父类接口 BaseBuilder
其他类解析:XPathParser
XML中的使用 XPathParser 进行解析
初始化
1 | typescript复制代码 // 启动时通过此方法构建 |
核心方法 parse(解析)
1 | scss复制代码 public void parse() { |
解析元素 configurationElement
如果Config中没有解析过该文件
1 | csharp复制代码 private void configurationElement(XNode context) { |
解析引用类缓存(cache-ref节点) cacheRefElement
在当前mapper执行过程中,如果配置了CacheRef,那么CacheRef中配置的接口类,将在当前类使用过程中使用缓存,首先请确保CacheRef中配置的接口类已经使用了缓存
1 | java复制代码 private void cacheRefElement(XNode context) { |
解析当前类缓存(cache节点) cacheElement
1 | ini复制代码 private void cacheElement(XNode context) throws Exception { |
Configuration在构建过程中会在typeAliasRegistry的TYPE_ALIASES赋值
1 | arduino复制代码 typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class); |
缓存的回收策略
- LRU:最近最少使用,移除最长时间不被使用的对象
- FIFO:先进先出,按对象进入缓存的顺序来移除它们
- SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
- WEAK:弱引用,更积极地移除基于垃圾收集器和弱引用规则的对象
解析入参映射关系(/mapper/parameterMap 节点)parameterMapElement
1 | ini复制代码private void parameterMapElement(List<XNode> list) throws Exception { |
解析出参映射关系(/mapper/resultMap 节点)resultMapElements
遍历所有的resultMap节点 调用resultMapElement方法
1 | scss复制代码 private ResultMap resultMapElement(XNode resultMapNode, List<ResultMapping> additionalResultMappings) throws Exception { |
处理构造函数节点
1 | csharp复制代码 private void processConstructorElement(XNode resultChild, Class<?> resultType, List<ResultMapping> resultMappings) throws Exception { |
构建ResultMapping属性
1 | ini复制代码 private ResultMapping buildResultMappingFromContext(XNode context, Class<?> resultType, List<ResultFlag> flags) throws Exception { |
解析discriminator(鉴频器)
1 | ini复制代码 private Discriminator processDiscriminatorElement(XNode context, Class<?> resultType, List<ResultMapping> resultMappings) throws Exception { |
解析SQL代码块(/mapper/sql 节点) sqlElement
1 | java复制代码 private void sqlElement(List<XNode> list) throws Exception { |
解析SQL执行语句() buildStatementFromContext 解析
1 | scss复制代码 private void buildStatementFromContext(List<XNode> list) { |
解析SQL节点(select|insert|update|delete节点)XMLStatementBuilder.parseStatementNode
使用XMLStatementBuilder解析
1 | ini复制代码 public void parseStatementNode() { |
解析SelectKeyNodes processSelectKeyNodes
1 | ini复制代码 private void processSelectKeyNodes(String id, Class<?> parameterTypeClass, LanguageDriver langDriver) { |
文章链接
- 【Myabtis】- 1. 整合spring boot后启动流程
- 【Mybatis】- 1.1 启动过程中,Mapper接口的扫描与代理注册
- 【Mybatis】- 1.2 启动过程中,Mapper.xml的解析
- 【Mybatis】- 2. SQL语句的执行过程
- 【Mybatis-附件1】- Mapper.xml 参数配置以及含义
本文转载自: 掘金