mybatis源码阅读系列(三)

51 阅读3分钟

前言

从上一篇文章mybatis源码阅读系列(二),我们大概可以了解到mybatis执行SQL用到的三个重要是的对象实例,包括:SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession,下面让我们深入了解下每个对象内部的实现。

XMLConfigBuilder(xml解析器)

从上面图片可以看到实例化XMLConfigBuilder后,就调用了parse方法去解析xml的文件。

 1 public Configuration parse() {
 2     // 限定每个 XMLConfigBuilder 只能使用一次。
 3     // 一旦XMLConfigBuilder用于构建配置,就不应再用于解析另一个配置文件或重新构建配置。
 4    if (parsed) {
 5      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
 6    }
 7    parsed = true;
 8     // 从根节点configuration节点开始解析
 9    parseConfiguration(parser.evalNode("/configuration"));
10     // 最终返回会话的配置信息
11    return configuration;
12  }
 1 private void parseConfiguration(XNode root) {
 2    try {
 3      // 解析节点properties,把定义的常量设置到配置文件里面,
 4     // 例如:用户名,密码,驱动,数据库连接
 5      propertiesElement(root.evalNode("properties"));
 6      // 解析settings节点,把key-value封装成对象实例Properties
 7      Properties settings = settingsAsProperties(root.evalNode("settings"));
 8     // 加载自定义虚拟文件系统vfs,mybatis有两个默认实现,也可以自己实现
 9      loadCustomVfs(settings);
10     // 加载自定义日志
11      loadCustomLogImpl(settings);
12     // 自定义类的别名
13      typeAliasesElement(root.evalNode("typeAliases"));
14     // 加载自定义插件
15      pluginElement(root.evalNode("plugins"));
16     // 自定义对象工厂,创建对象
17      objectFactoryElement(root.evalNode("objectFactory"));
18     // 自定义对家加工工厂
19      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
20      // 自定义反射工厂
21      reflectorFactoryElement(root.evalNode("reflectorFactory"));
22      // 加载默认配置参数
23      settingsElement(settings);
24     // 加载数据源和事务管理器
25      environmentsElement(root.evalNode("environments"));
26     // 加载数据库厂商标识,主要用于实现数据库兼容性
27      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
28     // 加载类型处理器
29      typeHandlerElement(root.evalNode("typeHandlers"));
30     // 加载映射处理器
31      mapperElement(root.evalNode("mappers"));
32    } catch (Exception e) {
33      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
34    }
35  }

执行处理器

当开启会话时,默认走的是简单类型的执行器
SqlSession sqlSession = sqlSessionFactory.openSession()

从上面可以看出执行器分为三种:

  • SIMPLE:这是默认的执行器类型。它简单地对每个语句进行操作,每次执行 SQL 语句时,都会打开和关闭一个新的事务。如果调用者没有开启事务,那么这个执行器会自动管理事务。对于简单的操作,这是最合适的执行器。
  • REUSE:这个执行器重用预处理语句(PreparedStatement)。在相同的 SQL 语句和参数下,它会重用预处理语句,从而减少数据库的准备语句开销。这对于频繁执行相同 SQL 语句的场景很有用。
  • BATCH:批量执行器会将多个 SQL 语句打包在一起执行。这对于执行大量插入、更新和删除操作时非常有效,因为它减少了数据库的往返次数,提高了性能。使用批量执行器时,你需要手动提交或回滚事务。