Mybatis源码解析2:全局配置

手写 Mybatis框架及分析 Version 2.0 版本 ​ 上篇文章我们介绍了将JDBC源码改造成简单的Mybatis V1版本,这个V1版本的目的是打开我们手写Mybatis源码的思路。接下来,这篇文章中我们要来分析并手写Mybatis V2版本的源码了。 将Mybatis V1版本升级成 Mybatis V2 版本 1、将 properties配置文件升级成 xml文件 2、按照 Mybatis的用法,将 xml配置文件分成 全局配置文件和映射文件 3、对 xml配置文件进行解析 解析Mybatis的全局配置文件和映射文件 1、全局配置文件 ​ 全局配置文 阅读详情

1.项目结构

源码地址:
项目结构:
在这里插入图片描述

2. 源码分析

2.1.SqlSessionFactoryBuilder#build(java.io.InputStream)

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        inputStream.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }
  1. 创建XMLConfigBuilder对象。Mybatis的xml分为两种,一种是配置文件xml,主要是用来全局配置,比如拦截器、别名、还有mapper文件路径或包名路径等(官网列出了所有的配置属性)。还有一种是Mapper.xml,也是用来声明要执行的Sql,一般会与Mapper接口进行绑定。从名字上来看,XMLConfigBuilder显然就是用来解析第一种xml的对象。
  2. XMLConfigBuilder#parse对配置文件进行解析,将解析的数据封装到Configuration对象里面。最终将全局配置Configuration封装DefaultSqlSessionFactory对象里面返回。

2.2 XMLConfigBuilder构造器

public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {
 this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);
}
 
public XPathParser(InputStream inputStream, boolean validation, Properties variables, EntityResolver entityResolver) {
  commonConstructor(validation, variables, entityResolver);
  this.document = createDocument(new InputSource(inputStream));
}

private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
 super(new Configuration());
  ErrorContext.instance().resource("SQL Mapper Configuration");
  this.configuration.setVariables(props);
  this.parsed = false;
  this.environment = environment;
  this.parser = parser;
}
  1. XMLConfigBuilder构造器创建了XPathParser。而XPathParser里面的xpath是通过jdk里面rt.jar实现的,xpath主要是对xml文档进行解析(可以理解为从Document对象中获信息,比如子节点、当前节点的属性等)。在XPathParser对象创建的过程中也调用了XPathParser#createDocument方法,将配置文件流解析成了Document对象。
  2. XMLConfigBuilder里面创建了全局的Configuration对象,这个对象在Mybatis整个流程中都被使用

2.3 解析XMLConfigBuilder#parse

public Configuration parse() {
   if (parsed) {
     throw new BuilderException("Each XMLConfigBuilder can only be used once.");
   }
   parsed = true;
   parseConfiguration(parser.evalNode("/configuration"));
   return configuration;
 }
  1. XPathParser#evalNode(java.lang.String) 方法通过xpath解析configuration根节点,将解析出的节点信息封装成mybatis的XNode对象,方便后续获取当前节点的属性和子节点的信息。
  2. 对文档的节点信息进行解析,封装在全局配置Configuration里面

2.4 解析配置 XMLConfigBuilder#parseConfiguration

private void parseConfiguration(XNode root) {
    try {
      //issue #117 read properties first
      propertiesElement(root.evalNode("properties"));
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      loadCustomVfs(settings);
      loadCustomLogImpl(settings);
      typeAliasesElement(root.evalNode("typeAliases"));
      pluginElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
      settingsElement(settings);
      // read it after objectFactory and objectWrapperFactory issue #631
      environmentsElement(root.evalNode("environments"));
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      typeHandlerElement(root.evalNode("typeHandlers"));
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }
  1. 该方法主要是从XNode中读取config.xml配置,并且将配置封装到全局变量Configuration里面,包含了别名、拦截器、反射工厂、数据源、类型转换器、mapper的资源信息等,这里就不一一说明了。这些配置为后面Sql的执行奠定了基础。
  2. 后面会对mapperElement(root.evalNode(“mappers”))方法解析
MyBatis解析全局配置文件 MyBatis是一个持久层的ORM框架,使用简单,学习成本较低。可以执行自己手写的SQL语句,比较灵活。但是MyBatis的自动化程度不高,移植性也不高,有时从一个数据库迁移到另外一个数据库的时候需要自己修改配置,所以称只为半自动ORM框架。 阅读详情

相关推荐

深入解析MyBatis源码与实战

摘要:本文系统解析MyBatis核心架构与实现原理,涵盖配置解析、SQL执行、结果映射三大模块。通过动态SQL生成、缓存机制(一级/二级缓存)、插件开发(Interceptor接口)等典型示例,深入剖析源码实现。结合SpringBoot集成场景,展示CRUD操作、动态SQL拼接、事务管理、多数据源配置等实战方案,并给出批量操作优化(BatchExecutor)、类型处理器扩展等高级特性实现。特别说明流程图关键节点:从SqlSessionFactory构建到Executor执行,通过StatementHand

keny-大成的博客 1359

【MyBatis】MyBatis解析全局配置文件源码详解

这篇文章主要介绍了 MyBatis 解析全局配置文件的过程,包括配置文件解析入口、初始化 XMLConfigBuilder、解析全局配置文件、创建 SqlSessionFactory 对象等步骤。文章还详细分析了配置文件中各个节点的解析过程,如 properties、settings、environments、typeAliases、typeHandler、mappers 等。最后,文章总结了 MyBatis 解析全局配置文件的流程。

小七的博客 1520

MyBatis全局配置文件解析与优化实践

MyBatis作为Java生态中广泛使用的ORM框架,其全局配置文件是框架运行的核心枢纽。配置文件通过XML定义数据源、事务管理、类型处理器等关键组件,采用严格的解析顺序确保配置正确加载。理解properties元素的三级优先级机制和typeHandler的注册流程,能有效解决生产环境中的配置冲突问题。在分布式系统和高并发场景下,合理配置缓存策略和databaseIdProvider能显著提升性能。掌握插件拦截器的逆序执行特性,可以实现精细化的SQL监控和改写。本文结合源码解析和实战经验,深入讲解MyBat

fanjava 298

手写MyBatis第33弹-MyBatis启动流程解密:SqlSessionFactoryBuilder如何协调全局配置解析

本文深入解析了MyBatis框架中SqlSessionFactoryBuilder的核心作用与实现机制。作为MyBatis启动流程中的关键组件,它采用Builder模式将复杂配置解析过程封装起来,通过XMLConfigBuilder解析全局配置文件,最终构建出可用的SqlSessionFactory实例。文章详细剖析了配置文件的组成内容、构建过程的实现代码,并阐释了其"一次性使用"设计哲学的优点。该构建者的精妙设计体现了软件工程中"封装复杂性"的重要原则,使MyBat

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 1780

【RF】Receiver Function接收函数:从理论到实践的深度解析

本文深入解析地震学中的接收函数(Receiver Function, RF)技术,从理论原理到实践操作。文章将RF比作地球的“听诊器”,详细阐述了其通过反褶积剥离震源影响、揭示地下结构(如莫霍面)的核心机制,并提供了使用Python和rf库进行数据处理、计算、动校正与叠加的完整实战流程,同时探讨了其应用、局限性与常见问题的解决方案。

Jerry的专栏 121

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何利用Python爬虫技术,快速抓取东方财富网的实时股票数据。通过逆向分析其JSONP数据接口,构建了包含请求处理、数据清洗、分页调度及多格式存储的完整自动化采集系统,并提供了应对反爬策略与生产部署的进阶优化思路,附有可直接运行的完整代码。

weixin_29084231的博客 870

Mybatis源码解析(二):全局配置文件的解析

Mybatis入口从加载配置文件→输入流→Document对象→XNode对象从创建XMLConfigBuilder→Configuration→解析核心xml填充Configuration对象。

从基础到源码解析的学习记录 1245

metaRTC嵌入式webrtc编译指南

metaRTC编译支持qmake和cmake,qmake使用QT最为方便,新版本新增了cmake支持。 ...

metaRTC的博客 9517

MyBatis 源码分析 - 配置文件解析过程

在上一篇文章中,我介绍了 MyBatis 的一些基础知识,用于为本文及后续的源码分析文章进行铺垫。经过前面的铺垫,我觉得是时候后分析一下 MyBatis 源码了。在本篇文章中,我将从 MyBatis 解析配置文件的过程着手进行分析。并会在分析的过程中,向大家介绍一些配置的使用方式和用途。MyBatis 的配置比较丰富,很难在一篇文章中把所有配置的解析过程分析完。所以关于配置文件的解析,这里会分两篇文章进行讲解。本篇文章将会分析诸如settings以及等标签的解析过程。

攻城狮不是猫 1316

体系结构学习-6-超标量处理器

 MIPS32-5段流水线采用了指令级并行方式(5个流水段同时运行5条指令)提升系统吞吐率,是一种标量处理器(CPI≥1CPI \ge 1CPI≥1),但是一个周期一条指令以及无法满足现代计算机需求了。 超标量处理器(Superscalar) 1、基本思想:增强指令集并行,让每个周期执行更多指令,实现 CPI<1CPI<1CPI<1 。(IPC=1/CPIIPC = 1...

qq_40891899的博客 1210

最大似然估计、梯度下降、EM算法、坐标上升

主要讲解的是机器学习中参数学习算法之间的区别,以及应用的场景。 最大似然估计: 其中目标函数是对数似然函数。为了求目标函数取最大值时的theta。有两个关机键步骤,第一个是对目标函数进行求导,第二个是另导数等于0,求解后直接得到最优theta。两个步骤缺一不可。 梯度下降: 对目标函数进行求导,利用导函数提供的梯度信息,使参数往梯度下降最快的方向移动一小步,来更新参数。为什

tzl2093的博客 5141

深入浅出Mybatis源码解析——全局配置文件解析(全局配置文件解析加载流程附篇)

前言 首先要说下停更这么久的原因,因为工作上最近有点忙,加上学习债的繁重以至于没有继续更新Mybatis源码解析的文章,所以趁着忙里偷闲,来简单的更新一篇。 在上一篇文章深入浅出Mybatis源码解析——全局配置文件解析加载流程中,我们讲到了全局配置文件的一个加载的过程,既然只是一个加载的流程,那就有解析的流程的啦!因此大家也猜到了,本篇正是讲全局配置文件中的一些解析,在parseConfig...

寒山道杳 309

在 VS Code 里配置 SAP Joule for Developers 的 ABAP AI side-by-side 能力

摘要: 随着ABAP开发工具链的演进,VS Code逐渐融入ABAP开发流程,SAP Joule for Developers的ABAP AI能力通过side-by-side模式(基于BTP中央服务)为多系统开发提供统一AI支持。该模式避免了各ABAP后端独立升级AI能力的碎片化问题,由管理员配置BTP订阅URL后,开发者可在ADT或VS Code中全局调用。实际落地需注意角色分工(管理员配置服务,开发者填写URL)、AI units资源规划及配置细节(如区分全局与项目级设置)。建议将Joule URL纳入

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 120

Mybatis框架源码笔记(三)之Mybatis接口的全局配置文件及*Mapper.xml文件扫描解析过程分析

Mybatis框架之mapper接口以及接口对应的xml文件的解析流程分析

最爱嫣夜来 2485

智能能效管家:基于 ESP32 的智能插座设计与精细化功耗管理实现

针对传统插座无法远程控制、功耗监测缺失、能源浪费严重等问题,本文设计一款基于 ESP32 主控芯片的智能插座。该系统集成 WiFi 无线通信、交流功耗采集、继电器通断控制模块,实现四大核心功能。硬件采用模块化选型与安全接线设计,软件基于 Arduino-ESP32 框架开发,搭载 Mqtt 通信协议与功耗算法,可通过手机 / 云端实时管控设备,有效提升用电安全性与能源利用率。:ESP32;智能插座;功耗管理;远程控制;能耗监测。

weixin_42300449的博客 101

工程师必读一次性讲明白系列(十三)眼图、阻抗匹配、信号一致性、射频匹配、电磁感应

概念主要作用影响因素解决方法眼图评估信号质量,显示失真和噪声噪声、信号失真、时序抖动改善信号源、使用低噪声组件阻抗匹配避免信号反射,提高传输效率阻抗不匹配、传输线路特性使用匹配电路、适配器信号一致性保证信号稳定准确传输传输线路、噪声干扰使用屏蔽、滤波器,选择合适线路射频匹配确保射频信号高效传输天线设计、阻抗不匹配使用射频匹配器、调整天线设计电磁感应防止电磁干扰对信号的影响设备之间的电磁干扰(EMI)屏蔽、接地、滤波器。

weixin_43199439的博客 156

mybatis全局配置文件详解

mybatis解析配置文件详解

zhenghuishengq的博客 817

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Mybatis源码解析

mybatis的流程分析

WinnerBear的博客 5218

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mybatis源码解析-xml文件的解析

mybatis源码解析xml文件的流程

m0_54258715的博客 1285

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MyBatis源码:MyBatis源码超详细的解析与核心组件总结

/ 允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false。默认为false// 允许在嵌套语句中使用分页(ResultHandler)。如果允许使用则设置为false// 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN// 到经典 Java 属性名 aColumn 的类似映射。默认false// 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载。

weixin_51360020的博客 920

Mybatis 源码篇(一)全局配置文件的解析过程

配置文件解析入口 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStre...

西门吹雪花 639

MyBatis 源码解析:Environment 与 DataSource 配置实现

在 MyBatis 框架中,`Environment` 和 `DataSource` 是配置管理的核心部分。`Environment` 负责管理不同的运行环境(如开发、测试、生产环境),而 `DataSource` 则管理数据库连接的配置和管理。理解这两个组件的工作原理有助于我们更好地掌握 MyBatis 的配置管理和框架初始化过程。

捕风捉你 · 星桥API接入与大模型实战 1252

2.[mybatis]全局配置执行流程源码分析

mybatis全局配置执行流程源码分析轻量级的框架mybatis全局配置文件解析parseConfigurationsettings配置为解析别名解析别名使用方式一别名使用方式二插件解析环境配置的解析EnvironmentMapper配置解析bindMapperForNamespace 轻量级的框架mybatis mybatis在日常的开发中,使用的算是比较多的,它的底层也还是采用了JDBC的实现原理,但是总要的是它是一个ORM框架,就是对象关系数据映射框架,你可以简单理解就是你的sql语句写在配置文件中,

JAVA技术爱好者 240

Mybatis源码解析:配置解析流程

解析配置 在我看mybatis源码的时候,大部分代码还是很简单的,DefaultResultSetHandler这个类是最难的,没有之一,debug了很多遍,还是没太搞懂,基于ResultSetHandler也并不是很重要,所以本系列我就不会写ResultSetHandler的内容了 mybatis解析配置阶段的代码还是比较简单的,基本上就是对配置文件中的各种属性进行解析,然后将值保存到Configuration对象中,因此直接画个流程图就略过了。比较重要的过程,比如sql的解析过程我会单开一节来分析 解.

小识的博客 1176

MyBatis全局配置文件解析与核心机制详解

MyBatis作为Java生态中广泛使用的ORM框架,其全局配置文件是框架初始化的关键环节。配置文件通过XML定义数据源、事务管理、类型处理器等核心组件,采用分层解析机制确保依赖顺序正确。深入理解properties变量替换、typeHandlers注册、plugins拦截链等机制,能有效解决多环境配置冲突、类型转换异常等典型问题。本文以mybatis-config.xml为例,剖析从XPath解析到Configuration对象构建的全流程,特别针对environments配置、动态SQL处理等高频使用场

a1311010193的博客 412

Mybatis源码学习之全局配置文件和映射文件解析

2、parse方法则是调用了XPath对象的evalNode方法对配置文件中的configuration节点进行解析,会把节点内容放在XNode对象中然后返回;3、parseConfiguration方法会对configuration节点解析出来的内容再进行解析,会把解析出来的内容放在configuration对象中;

wsb_2526的博客 633
上一篇: MybatisPlus源码解析4:租户拦截器
下一篇: Mybatis源码解析3:注册Statement
hao9e
博客等级 码龄7年 189粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值