mybatis源码阅读系列(三)

WuYiLong原创大约 3 分钟mybatis源码阅读系列mybatis

前言

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

XMLConfigBuilder(xml解析器)

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

 public Configuration parse() {
     // 限定每个 XMLConfigBuilder 只能使用一次。
     // 一旦XMLConfigBuilder用于构建配置,就不应再用于解析另一个配置文件或重新构建配置。
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
     // 从根节点configuration节点开始解析
    parseConfiguration(parser.evalNode("/configuration"));
     // 最终返回会话的配置信息
    return configuration;
  }
 private void parseConfiguration(XNode root) {
    try {
      // 解析节点properties,把定义的常量设置到配置文件里面,
     // 例如:用户名,密码,驱动,数据库连接
      propertiesElement(root.evalNode("properties"));
      // 解析settings节点,把key-value封装成对象实例Properties
      Properties settings = settingsAsProperties(root.evalNode("settings"));
     // 加载自定义虚拟文件系统vfs,mybatis有两个默认实现,也可以自己实现
      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);
     // 加载数据源和事务管理器
      environmentsElement(root.evalNode("environments"));
     // 加载数据库厂商标识,主要用于实现数据库兼容性
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
     // 加载类型处理器
      typeHandlerElement(root.evalNode("typeHandlers"));
     // 加载映射处理器
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }

执行处理器

当开启会话时,默认走的是简单类型的执行器

SqlSession sqlSession = sqlSessionFactory.openSession()


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

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

上次编辑于:
贡献者: wuyilong