MyBatis SqlSessionFactoryBuilder 的作用是什么?

SqlSessionFactoryBuilder 在 MyBatis 中扮演着至关重要的角色,它的主要作用是构建 (Build) SqlSessionFactory 实例 。 你可以将 SqlSessionFactoryBuilder 理解为 SqlSessionFactory 的工厂的建造者

核心作用概括:

SqlSessionFactoryBuilder 的核心作用就是 抽象了 SqlSessionFactory 的创建过程,并提供了灵活、便捷的方式来从不同的配置源 (XML 配置文件、Java 代码配置) 构建 SqlSessionFactory 实例。

更详细的解释和作用分解:

  1. 抽象 SqlSessionFactory 的构建过程:

    • SqlSessionFactory 的创建并非一个简单的实例化过程,它涉及到加载和解析 MyBatis 的配置信息、初始化各种 MyBatis 组件 (例如数据源、事务管理器、Mapper 注册器等)、并将这些组件组装起来 ,最终才能得到一个可用的 SqlSessionFactory 实例。
    • SqlSessionFactoryBuilder 将这个复杂的构建过程封装起来,对外提供简洁的 build() 方法,隐藏了内部的构建细节。 开发者只需要调用 SqlSessionFactoryBuilder.build() 方法,传入配置信息,就可以获得 SqlSessionFactory 实例,无需关心底层的构建细节。
  2. 支持多种配置源 (Configuration Source):

    SqlSessionFactoryBuilder 提供了多个重载的 build() 方法,可以接受不同类型的配置源,从而支持从多种方式加载 MyBatis 配置:

    • 从 XML 配置文件 (InputStream): 这是最常用的方式,通过 build(InputStream inputStream) 方法,传入指向 MyBatis XML 配置文件的 InputStreamSqlSessionFactoryBuilder 会解析 XML 文件并构建 SqlSessionFactory
    • Configuration 对象 (Configuration): 通过 build(Configuration config) 方法,可以直接传入一个已经构建好的 Configuration 对象。 这种方式适用于使用 Java 代码配置 MyBatis 的场景。
    • Reader 对象 (Reader): 类似于 InputStream,但使用 Reader 读取字符流,适用于从字符流读取 XML 配置的情况。
    • XMLMapperBuilder 对象 (XMLMapperBuilder): 更底层的构建方式,通常不直接使用,用于更精细的配置解析控制。

    这种多配置源的支持,使得 MyBatis 的配置方式更加灵活,可以适应不同的应用场景和配置管理需求。

  3. 作为 SqlSessionFactory 的建造者 (Builder Pattern):

    SqlSessionFactoryBuilder 遵循了 建造者模式 (Builder Pattern) 设计模式。 建造者模式的核心思想是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

    在 MyBatis 中:

    • 建造者 (Builder): SqlSessionFactoryBuilder 类。
    • 产品 (Product): SqlSessionFactory 接口及其实现类 (通常是 DefaultSqlSessionFactory)。
    • 导演 (Director - 隐含): SqlSessionFactoryBuilder.build() 方法及其内部的解析和构建逻辑,它控制着 SqlSessionFactory 的构建步骤。
    • 具体建造者 (Concrete Builder - 隐含): XMLConfigBuilder 等类,负责解析 XML 配置并填充 Configuration 对象,可以看作是 SqlSessionFactoryBuilder 构建过程中的具体步骤的实现。

    通过建造者模式,SqlSessionFactoryBuilder 使得 SqlSessionFactory 的创建过程更加清晰、可维护、可扩展。 也使得配置加载和 SqlSessionFactory 的创建逻辑解耦,提高了代码的灵活性。

  4. 一次性使用,生命周期短暂:

    SqlSessionFactoryBuilder 的设计意图是 一次性使用 (One-time use) 的。 它的生命周期很短暂,主要用于构建 SqlSessionFactory 实例。 一旦 SqlSessionFactory 被成功构建,SqlSessionFactoryBuilder 就完成了它的使命,可以被丢弃,不再需要长期持有。

    通常,在 MyBatis 应用的启动阶段,你会使用 SqlSessionFactoryBuilder 构建 SqlSessionFactory,然后将 SqlSessionFactory 对象缓存起来 (例如作为单例 Spring Bean 管理),供整个应用生命周期使用。 你不会在每次需要 SqlSession 时都去创建 SqlSessionFactoryBuilder

  5. 核心方法:build() 方法:

    SqlSessionFactoryBuilder 的核心方法是 build() 方法。 所有重载的 build() 方法最终都会返回一个 SqlSessionFactory 实例。 build() 方法内部会完成以下主要工作:

    • 解析配置源: 根据传入的配置源 (例如 InputStream),解析 MyBatis 配置信息。 如果是 XML 配置,会使用 XMLConfigBuilder 进行解析。
    • 构建 Configuration 对象: 将解析得到的配置信息构建成一个 Configuration 对象。 Configuration 对象包含了 MyBatis 的所有配置 (数据源、事务管理器、Mapper 映射、全局设置等)。
    • 创建 SqlSessionFactory 实例: 使用构建好的 Configuration 对象,创建 SqlSessionFactory 实例 (通常是 DefaultSqlSessionFactory 实例)。
    • 返回 SqlSessionFactory 实例: 将创建好的 SqlSessionFactory 实例返回给调用者。

总结 SqlSessionFactoryBuilder 的作用:

  • 构建 SqlSessionFactory 实例: 这是 SqlSessionFactoryBuilder 的核心和唯一目的。
  • 抽象 SqlSessionFactory 的复杂创建过程: 简化 SqlSessionFactory 的创建流程,隐藏内部细节。
  • 支持多种配置源: 允许从 XML 配置文件、Java 代码配置等多种方式加载 MyBatis 配置。
  • 遵循建造者模式: 使得 SqlSessionFactory 的构建过程更加清晰、灵活、可扩展。
  • 一次性使用,生命周期短暂: 主要用于构建 SqlSessionFactory,构建完成后即可丢弃。
  • 提供 build() 方法作为入口: 通过 build() 方法对外提供简洁的 SqlSessionFactory 构建 API。

简单比喻:

你可以将 SqlSessionFactoryBuilder 比喻成一个 组装工厂的工程师 。 工程师 (SqlSessionFactoryBuilder) 负责根据设计图纸 (MyBatis 配置) 和原材料 (配置源),一步步地组装出最终的工厂 ( SqlSessionFactory )。 一旦工厂组装完成,工程师的任务就完成了,他就可以离开了 (一次性使用)。 而组装好的工厂 (SqlSessionFactory) 就可以开始源源不断地生产产品 ( SqlSession ) 了。

相关推荐
张较瘦_2 小时前
[论文阅读] 软件工程 | 告别“线程安全玄学”:基于JMM的Java类静态分析,CodeQL3分钟扫遍GitHub千仓错误
java·论文阅读·安全
A尘埃3 小时前
智慧零售全渠道业务中台系统
java·零售
小wanga7 小时前
C++知识
java·开发语言·c++
我是渣哥7 小时前
Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
java·开发语言·jvm·后端·算法·职场和发展·性能优化
工一木子7 小时前
深入Java并发:锁机制原理剖析与性能优化实战
java·性能优化·并发·
你我约定有三7 小时前
java--写在 try 中的创建连接
java·开发语言
ERP老兵-冷溪虎山7 小时前
Python/JS/Go/Java同步学习(第三篇)四语言“切片“对照表: 财务“小南“纸切片术切凭证到崩溃(附源码/截图/参数表/避坑指南/老板沉默术)
java·javascript·python·golang·中医编程·四语言同步学习·职场生存指南
科技树支点7 小时前
无GC的Java创新设计思路:作用域引用式自动内存管理
java·python·go·web·编程语言·编译器
码农小伙7 小时前
ConcurrentHashMap解析
java·开发语言