MyBatis实现配置加载的步骤

2023-05-30 0 2,035

目录

前言

原始MyBatis的使用中,使用MyBatis时会先读取配置文件mybatis-config.xml字符流或者字节流,然后通过SqlSessionFactoryBuilder基于配置文件的字符流或字节流来构建SqlSessionFactory

本篇文章将结合MyBatis源码,对读取配置文件mybatis-config.xml和构建SqlSessionFactory的原理进行学习。

正文

原始MyBatis读取配置文件mybatis-config.xml和构建SqlSessionFactory的一个示例如下。

InputStream inputStream = Resources.getResourceAsStream(\"mybatis-config.xml\");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

上述示例中的Resources工具类提供了方法可以读取classpath下指定名字的文件为字符流或者字节流,这里是使用了其提供的getResourceAsStream() 方法将mybatis-config.xml 文件读取为字节流。SqlSessionFactoryBuilder是一个建造者,其提供了共计9个重载的build() 方法用于构建SqlSessionFactory,这9个build() 方法可以分为三类,概括如下。

  • 基于配置文件字符流构建SqlSessionFactory
  • 基于配置文件字节流构建SqlSessionFactory
  • 基于Configuration类构建SqlSessionFactory

实际上,基于配置文件字符流和基于配置文件字节流构建的方式,最终都是将字符流或字节流解析并生成Configuration类,然后基于Configuration类构建SqlSessionFactory

下面以基于配置文件字节流构建SqlSessionFactory的过程为例,对整个读配置文件的流程进行说明。上面的示例中调用的build() 方法如下所示。

public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
}

上面被调用的重载的build() 方法如下所示。

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
        // XMLConfigBuilder会解析配置文件并生成Configuration类
        XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
        // 调用入参为Configuration的build()方法构建SqlSessionFactory并返回
        return build(parser.parse());
    } catch (Exception e) {
        throw ExceptionFactory.wrapException(\"Error building SqlSession.\", e);
    } finally {
        ErrorContext.instance().reset();
        try {
            inputStream.close();
        } catch (IOException e) {
        }
    }
}

可以发现,配置文件的解析是发生在XMLConfigBuilderparse() 方法中,在查看parse() 方法前,先看一下XMLConfigBuilder的类图,如下所示。

MyBatis实现配置加载的步骤

通过XMLConfigBuilder的类图可以知道,XMLConfigBuilder解析配置文件是依靠XPathParser,而XPathParserMyBatis提供的基于JAVA XPath的解析器。同时,XMLConfigBuilder内部维护了一个Configuration,通过XPathParser解析配置文件得到的配置属性均会丰富到Configuration中。

现在开始分析XMLConfigBuilderparse() 方法,其实现如下所示。

public Configuration parse() {
    if (parsed) {
        throw new BuilderException(\"Each XMLConfigBuilder can only be used once.\");
    }
    parsed = true;
    parseConfiguration(parser.evalNode(\"/configuration\"));
    return configuration;
}

要理解parse() 方法,最好是和一个实际的配置文件进行对照,如下给出一个实际的配置文件。

<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
<!DOCTYPE configuration PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\"
        \"http://mybatis.org/dtd/mybatis-3-config.dtd\">
<configuration>
    <settings>
        <setting name=\"useGeneratedKeys\" value=\"true\"/>
    </settings>
    <environments default=\"development\">
        <environment id=\"development\">
            <transactionManager type=\"JDBC\"/>
            <dataSource type=\"POOLED\">
                <property name=\"driver\" value=\"com.mysql.cj.jdbc.Driver\"/>
                <property name=\"url\" value=\"jdbc:mysql://localhost:3306/test?characterEncoding=utf-8&amp;serverTimezone=UTC&amp;useSSL=false\"/>
                <property name=\"username\" value=\"root\"/>
                <property name=\"password\" value=\"root\"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name=\"com.mybatis.learn.dao\"/>
    </mappers>
</configuration>

所以在parse() 方法中,首先是获取配置文件的configuration节点(根节点),然后将configuration节点传入parseConfiguration() 方法,接着在parseConfiguration() 方法中会根据传入的configuration节点依次获取子节点并读取子节点属性,最后将获取到的属性丰富进ConfigurationparseConfiguration() 方法实现如下所示。

private void parseConfiguration(XNode root) {
    try {
        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);
        // 丰富environments标签及其子标签的属性到Configuration中
        environmentsElement(root.evalNode(\"environments\"));
        databaseIdProviderElement(root.evalNode(\"databaseIdProvider\"));
        typeHandlerElement(root.evalNode(\"typeHandlers\"));
        // 丰富mappers标签的属性到Configuration中
        mapperElement(root.evalNode(\"mappers\"));
    } catch (Exception e) {
        throw new BuilderException(\"Error parsing SQL Mapper Configuration. Cause: \" + e, e);
    }
}

最后parse() 方法会返回ConfigurationSqlSessionFactoryBuilder会基于Configuration创建DefaultSqlSessionFactory并返回,如下所示。

public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
}

DefaultSqlSessionFactory类图如下所示。

MyBatis实现配置加载的步骤

至此,读取配置文件mybatis-config.xml和构建SqlSessionFactory的基本原理已经介绍完毕。

总结

本篇文章对MyBatis读取配置文件并构建SqlSessionFactory的一个整体流程进行了介绍,可以概括如下。

  • Resources工具类获取配置文件输入字符流或字节流;
  • 创建SqlSessionFactoryBuilder
  • SqlSessionFactoryBuilder中会创建XMLConfigBuilder来解析配置文件得到全局唯一Configuration
  • 基于Configuration创建DefaultSqlSessionFactory

实际上,关于MyBatis配置文件的读取,最关键的部分在于如何注册映射文件/映射接口,该部分内容,会在后面的文章中进行学习。

资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 MyBatis实现配置加载的步骤 http://www.20zxx.cn/762816/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务