Mybatis(三):架构及解析器模块详解

本文详细解析Mybatis架构,包括核心处理层和基础支持层,并重点探讨XPathParser构造方法和解析方法,阐述占位符处理过程,以及XNode在解析中的作用。
摘要由CSDN通过智能技术生成

Mybatis(三):架构及解析器模块详解

mybatis


在前面的文章中我们了解了 Mybatis的基本使用及其执行流程。相信你已经对 Mybatis有了简单的了解。

今天我们正式进去源码学习阶段,在这篇文章中,我们首先介绍下Mybatis的结构,之后再学习下解析器模块的内容。

首先自行去github上下载其源码,地址为:https://github.com/mybatis/mybatis-3

为方便查看,我们将下载的源码导入到idea中,Mybaits的项目结构还是比较清晰明了的,目录如下所示:

image-20210819180007905

1 架构

通过Mybatis的源码我们发现,Mybatis将其模块分成了一个个的包,我们可以很清楚的知道其有哪些模块组成,接下来我们依次简单的介绍下这些模块:

  • annotations 注解 这个没什么可说的,Mybatis中的一些注解定义在了这个包里,例如:@Select @Insert @Update...
  • io 这个模块主要负责资源的加载,在上篇文章中提到的Resources类便是定义在这个模块下。
  • parsing 解析器 XPathParser封装了对xml文件的解析。
  • builder 配置解析模块 解析Mybatis配置文件及映射文件,将里面的信息封装到Configuration对象中。
  • parsing 解析器 这个模块的功能是负责我们定义的配置文件及映射文件的解析。XPathParser
  • binding 这个模块是负责将Mapper中的方法同xml文件中相关的SQL进行关联,MapperRegistryMypperProxyFactoryMypperProxyMapperMethod都是定义在这个模块下。
  • cache 缓存 使用Mybatis的同学应该都知道其有一级和二级缓存,这些功能便定义在这个模块中,有了缓存的存在,能够提高一些查询的性能,但如果在开发中不注意的话也会导致一些问题。
  • cursor 游标
  • datasource 数据源模块
  • executor 执行器模块 负责SQL的执行及结果的映射。
  • transaction 事务
  • logging 日志模块
  • mapping mapper对应的java类
  • plugin 插件
  • reflection 反射
  • scripting 动态sql解析
  • type 类型处理器
  • session sql会话

Mybatis的架构由接口层、核心处理层、基础支持层三部分组成。各层的组成模块如下图所示。

image-20210819212430029

2 解析器模块

解析器模块为Mybatis初始化时加载配置文件和mapper映射文件解析及动态SQL占位符的处理提供了支持。

Mybatis解析器模块的目录如下:

image-20210826201954683

2.1 XPathParser

XPathParserMybatis中的解析器,其对XPath进行了封装,其属性字段如下:

  • Document document Document对象
  • boolean validation 是否校验xml
  • EntiryResolver entityResolver
  • Properties variables 属性
  • XPath xpath Xpath对象
2.1.1 构造方法

XPathParser中提供了很多个构造方法,这里就不进行列举了,在这些方法中没有过多的逻辑,就是创建DocumentXPath对象并设置其他属性字段。

在其构造方法中会调用到commonConstructorcreateDocument两个方法,其源码如下:

private void commonConstructor(boolean validation, Properties variables, EntityResolver entityResolver) {
   
    // 设置是否校验XML
    this.validation = validation;
    // EntityResolver用于解析本地DTD或XSD
    this.entityResolver = entityResolver;
    // 配置文件中配置的properties
    this.variables = variables;
    // 创建XPath对象
    XPathFactory factory = XPathFactory.newInstance();
    this.xpath = factory.newXPath();
}

private Document createDocument(InputSource inputSource) {
   
    // important: this must only be called AFTER common constructor
    try {
   
        // 创建DocumentBuilderFactory对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
        // 是否校验
        factory.setValidating(validation);
		// 设置其他一些属性
        factory.setNamespaceAware(false);
        factory.setIgnoringComments(true);
        factory.setIgnoringElementContentWhitespace(false);
        factory.setCoalescing(false);
        factory.setExpandEntityReferences(true);
		// 创建DocumentBuilder对象
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 设置EntityResolver
        builder.setEntityResolver(entityResolver);
        builder.setErrorHandler(new ErrorHandler() {
   
            @Override
            public void error(SAXParseException exception) throws SAXException {
   
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值