MyBatis初始化方式
MyBatis初始化提供了两种方式:
- 基于XML配置文件:基于XML配置文件的方式是将MyBatis的所有配置信息放在XML文件中
mybatis-config.xml
,MyBatis通过加载并XML配置文件,将配置文信息组装成内部的Configuration对象。 - 基于Java API:基于Java API的方式是手动创建Configuration对象,然后将配置参数set 进入Configuration对象中。
任何框架的初始化,应该都是先加载配置信息,接下来我们将使用基于XML配置文件的方式,来深入讨论MyBatis是如何通过配置文件构建Configuration对象。
基于Xml配置初始化
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
通过一个简单的例子,分析一下基于Xml配置MyBatis是怎样完成初始化的,都做了些什么?
- mybatis-config.xml配置
1 | xml复制代码<?xml version="1.0" encoding="UTF-8" ?> |
MyBatis配置项提供了很多配置项,这个配置文件中只配置了一些基本的节点,只是用来演示。
如果有对MyBatis配置项不了解的或者不知道MyBatis提供哪些配置,可以去看看MyBatis官网文档,文档上对每一个配置项都已经做出了很详细的说明和示例。
- 程序入口代码
1 | java复制代码String resource = "mybatis-config.xml"; |
上述代码的功能是通过Resources工具类,调用ClassLoader读取classpath下的mybatis-config.xml配置文件,得到一个输入流inputStream,SqlSessionFactoryBuilder根据传入的数据流生成Configuration对象,然后根据Configuration对象创建默认的SqlSessionFactory实例。
源码分析
前面提到,SqlSessionFactoryBuilder根据传入的数据流生成Configuration对象,然后根据Configuration对象创建默认的SqlSessionFactory实例,现在让我们通过源码来一步一步看一看
- 调用SqlSessionFactoryBuilder对象的build(inputStream)方法
1 | java复制代码sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); |
SqlSessionFactoryBuilder是SqlSessionFactory的构造器,用于创建SqlSessionFactory,采用了Builder设计模式。
- SqlSessionFactoryBuilder会根据输入流inputStream等创建XMLConfigBuilder对象
1 | java复制代码public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { |
通过new XMLConfigBuilder()创建对象时,会生成Configuration对象和XPathParser对象
- Configuration对象主要是用来保存xml文件的配置信息
- XPathParser对象持有解析mybatis-config.xml文件和Mapper文件生成Document对象和解析mybatis-3-config.dtd文件和mybatis-3-mapper.dtd转换成XMLMapperEntityResolver对象
1 | java复制代码public XMLConfigBuilder(Class<? extends Configuration> configClass, InputStream inputStream, String environment, |
- SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parse()方法
1 | java复制代码public Configuration parse() { |
XMLConfigBuilder对象的parse()方法,主要是通过XpathParser根据Xpath表达式获取基本的DOM节点以及子节点Node信息的操作(解析的节点configuration, properties, settings, typeAliases, typeHandlers, objectFactory, objectWrapperFactory, plugins, environments, databaseIdProvider, mappers
), 然后将这些值解析出来设置到Configuration对象中,最后返回Configuration对象。
这里的节点解析就不一一去看了,后续会有单独的文章挑几个核心节点做详细介绍。
- 调用SqlSessionFactoryBuilder对象的build(configuration)方法
通过赋值的Configuration对象,调用build方法创建DefaultSqlSessionFactory对象。基于Java API方式,手动创建XMLConfigBuilder,并解析创建Configuration对象,最后调用此方法生成SqlSessionFactoryBuilder对象。
至此,我们就知道了MyBatis是如何通过配置文件构建Configuration对象,并使用它创建SqlSessionFactory对象。
总结
我们通过一个时序图,把整个myBatis初始化过程串起来,方便小伙伴更加直观的把整个流程串起来,从而对整个初始化过程了解的更加清晰
MyBatis初始化基本过程:
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 从 XML 配置文件或一个预先配置的 Configuration 实例来构建出来。
本文转载自: 掘金