ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

配置加载与初始化

配置加载与初始化

MyBatis配置加载:架构、解析流程与核心类解析

在MyBatis框架中,配置加载是整个框架初始化的第一步,负责加载并解析MyBatis的配置文件,进而初始化所有的配置信息。这一过程确保了系统能够正确初始化并启动。

1. 配置加载的作用与重要性

配置加载是MyBatis框架初始化的核心步骤,负责加载并解析MyBatis的配置文件(通常是mybatis-config.xml),进而初始化所有配置信息。配置文件的作用是定义全局配置,如数据库连接、映射文件路径、插件、日志等。配置加载过程包括:

  • 数据库连接池的初始化。
  • SQL映射的加载。
  • 类型处理器、缓存等组件的配置。

2. 配置加载的核心类——SqlSessionFactoryBuilder

SqlSessionFactoryBuilder是MyBatis配置加载的入口类,负责根据mybatis-config.xml文件创建SqlSessionFactorySqlSessionFactory是MyBatis执行SQL的核心对象。

核心流程

  1. 解析XML配置文件SqlSessionFactoryBuilder使用XMLConfigBuilder解析XML文件。
  2. 构建Configuration对象:解析后的配置信息被封装到Configuration对象中。
  3. 创建SqlSessionFactory:最终通过Configuration对象创建SqlSessionFactory

示例代码

java复制

public class SqlSessionFactoryBuilder { public SqlSessionFactory build(InputStream inputStream) { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream); Configuration configuration = parser.parse(); return new DefaultSqlSessionFactory(configuration); } }

3.XMLConfigBuilder解析配置文件

XMLConfigBuilder是MyBatis的配置解析器,负责将XML配置文件解析为Configuration对象。解析过程通过DOM解析器进行。

核心方法

  • document.getRootElement():获取XML文档的根元素(通常是<configuration>节点)。
  • parseConfiguration():将配置文件中的各个节点(如<settings><properties><mappers>等)逐一解析并加载到Configuration对象中。

4.Configuration类的初始化

Configuration类是MyBatis的核心配置类,保存着MyBatis的所有配置信息。它包含了数据库连接信息、映射器信息、插件、类型处理器等。

初始化过程

  • 读取数据库连接池信息:加载<environment><dataSource>节点。
  • 初始化类型处理器:加载<typeHandlers>节点。
  • 配置插件:加载<plugins>节点。
  • 加载映射器:加载<mappers>节点。

示例代码

java复制

public class Configuration { private DataSource dataSource; private TypeHandlerRegistry typeHandlerRegistry; private PluginRegistry pluginRegistry; private List<MappedStatement> mappedStatements; public void addMapper(String resource) { // 加载Mapper文件 loadMapper(resource); } private void loadMapper(String resource) { InputStream inputStream = Resources.getResourceAsStream(resource); XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, this, resource); mapperParser.parse(); } }

5. 解析数据库连接配置

mybatis-config.xml配置文件中,数据库连接信息通常通过<environment><dataSource>节点进行配置。XMLConfigBuilder会读取这些信息,并将其转化为相应的DataSource对象。

数据源类型

  • POOLED:使用连接池。
  • UNPOOLED:不使用连接池。

示例代码

java复制

public void parseConfiguration(XNode root) throws Exception { XNode environmentsNode = root.evalNode("environments"); if (environmentsNode != null) { for (XNode environmentNode : environmentsNode.getChildren()) { String type = environmentNode.getStringAttribute("type"); DataSource dataSource = createDataSource(type); configuration.setDataSource(dataSource); } } }

6. 解析类型处理器和插件配置

MyBatis支持自定义类型处理器和插件,它们的配置通常在<typeHandlers><plugins>节点下。

核心代码

java复制

public void parseConfiguration(XNode root) throws Exception { // 解析<TypeHandlers>节点,注册自定义类型处理器 XNode typeHandlersNode = root.evalNode("typeHandlers"); if (typeHandlersNode != null) { for (XNode typeHandlerNode : typeHandlersNode.getChildren()) { String handler = typeHandlerNode.getStringAttribute("handler"); configuration.getTypeHandlerRegistry().register(handler); } } // 解析<Plugins>节点,注册插件 XNode pluginsNode = root.evalNode("plugins"); if (pluginsNode != null) { for (XNode pluginNode : pluginsNode.getChildren()) { String interceptor = pluginNode.getStringAttribute("interceptor"); configuration.addInterceptor(interceptor); } } }

核心方法

  • getTypeHandlerRegistry():将自定义类型处理器注册到Configuration中。
  • addInterceptor():将插件注册到Configuration中。

7. Mapper文件的加载与解析

Mapper文件通常用于定义具体的SQL语句,在mybatis-config.xml中的<mappers>节点下配置。XMLConfigBuilder会根据这些配置加载Mapper文件并注册。

示例配置

xml复制

<configuration> <mappers> <mapper resource="com/example/UserMapper.xml"/> </mappers> </configuration>

核心代码

java复制

public void parseConfiguration(XNode root) throws Exception { XNode mappersNode = root.evalNode("mappers"); if (mappersNode != null) { for (XNode mapperNode : mappersNode.getChildren()) { String resource = mapperNode.getStringAttribute("resource"); // 加载Mapper文件 loadMapper(resource); } } } private void loadMapper(String resource) { InputStream inputStream = Resources.getResourceAsStream(resource); XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource); mapperParser.parse(); }

XMLMapperBuilder的作用

XMLMapperBuilder负责解析具体的Mapper.xml文件,将SQL语句解析并映射到MappedStatement对象中。

返回列表