MyBatis SqlSessionFactory 是如何创建的?

MyBatis原理分析之获取SqlSessionFactory MyBatis的执行原理分为如下四步: ① 获取SqlSessionFactory ② 获取SqlSession ③ 获取mapper的代理对象 ④ sqlsession进行具体CRUD过程 这里又分为三种场景: ① 无spring环境 自己手动根据mybatis配置文件获取SqlSessionFactory和SqlSession ② 传统ssm环境 通常在applicationContext.xml中注册了SqlSessionFactory和SqlSession ③ SpringBoot 阅读详情

SqlSessionFactory 是 MyBatis 的核心接口之一,它是创建 SqlSession 实例的工厂。 SqlSession 实例是 MyBatis 与数据库交互的主要接口,负责执行 SQL 语句、管理事务等。

SqlSessionFactory 的创建过程主要由 SqlSessionFactoryBuilder 类负责。 SqlSessionFactoryBuilder 遵循建造者模式,提供多种构建 SqlSessionFactory 的方法,可以从不同的配置源 (如 XML 配置文件、Java 代码配置) 构建 SqlSessionFactory 实例。

以下是 SqlSessionFactory 的详细创建步骤,以及涉及的关键类和方法:

1. 获取 MyBatis 配置信息 (Configuration Source):

在创建 SqlSessionFactory 之前,首先需要加载和解析 MyBatis 的配置信息。 MyBatis 配置信息可以来源于以下几种方式:

  • XML 配置文件 (mybatis-config.xml 或自定义 XML 文件): 这是最常见的配置方式,通过 XML 文件定义 MyBatis 的全局配置、数据源、事务管理器、Mapper 映射文件等。
  • Java 代码配置 (使用 Configuration 类): 也可以使用 Java 代码直接构建 Configuration 对象,并设置各种配置项。
  • Spring 集成 (Spring Boot 或 Spring Framework): 当 MyBatis 与 Spring 集成时,Spring 容器会负责管理 SqlSessionFactory 的创建和生命周期,配置信息通常由 Spring 管理。

2. 使用 SqlSessionFactoryBuilder 构建 SqlSessionFactory:

SqlSessionFactoryBuilder 类提供了多个重载的 build() 方法,用于根据不同的配置源构建 SqlSessionFactory 实例。 最常用的 build() 方法接受一个 InputStream 参数,用于读取 XML 配置文件。

常见的 SqlSessionFactoryBuilder.build() 方法调用方式:

  • 从 XML 配置文件构建 (最常用):

    String resource = "mybatis-config.xml"; // MyBatis 配置文件路径
    InputStream inputStream = Resources.getResourceAsStream(resource); // 使用 Resources 工具类加载资源
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    
    • Resources.getResourceAsStream(resource): MyBatis 提供的 Resources 工具类,用于从类路径 (classpath) 或文件系统加载资源文件 (例如 XML 配置文件)。
    • new SqlSessionFactoryBuilder().build(inputStream): 创建 SqlSessionFactoryBuilder 实例,并调用 build(inputStream) 方法,传入配置文件的 InputStream。 build() 方法会解析 XML 配置文件,并构建 SqlSessionFactory 实例。
  • 从 Configuration 对象构建 (Java 代码配置):

    Configuration configuration = new Configuration();
    // ... 通过 configuration 对象设置各种 MyBatis 配置,例如:
    // configuration.setEnvironment(environment);
    // configuration.addMapper(UserMapper.class);
    // ...
    
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
    
    • new Configuration(): 创建 Configuration 对象。
    • 通过 configuration 对象,可以使用其提供的 API 方法 (例如 setEnvironment(), addMapper(), getTypeHandlerRegistry(), getInterceptors(), getSettings(), getProperties() 等) 来设置 MyBatis 的各种配置项。
    • new SqlSessionFactoryBuilder().build(configuration): 调用 SqlSessionFactoryBuilder 的 build(configuration) 方法,传入配置好的 Configuration 对象,构建 SqlSessionFactory 实例。

3. SqlSessionFactoryBuilder.build() 方法内部的详细步骤 (以 XML 配置为例):

SqlSessionFactoryBuilder.build(InputStream inputStream) 方法内部会执行以下关键步骤来创建 SqlSessionFactory:

  • 3.1. 创建 XMLConfigBuilder 对象:

    XMLConfigBuilder parser = new XMLConfigBuilder(inputStream);
    
    • XMLConfigBuilder 是 MyBatis 提供的 XML 配置解析器,专门用于解析 MyBatis 的 XML 配置文件。
    • 构造 XMLConfigBuilder 时,需要传入配置文件的 InputStream。
  • 3.2. 解析 XML 配置文件并构建 Configuration 对象:

    Configuration configuration = parser.parse();
    
    • 调用 XMLConfigBuilder 的 parse() 方法,开始解析 XML 配置文件。
    • parse() 方法会读取 XML 配置文件中的各个元素 (例如 <configuration>, <environments>, <mappers>, <typeHandlers>, <plugins>, <settings>, <properties> 等),并根据 XML 文件的内容,构建并填充一个 Configuration 对象。
    • XMLConfigBuilder.parse() 方法内部会完成以下主要工作:
      • 解析 <configuration> 根元素: 读取 <configuration> 元素下的子元素。
      • 解析 <properties> 元素: 加载外部属性文件或 <properties> 元素内部的属性配置。
      • 解析 <settings> 元素: 设置 MyBatis 的全局设置,例如缓存策略、延迟加载、日志配置等。
      • 解析 <typeAliases> 元素: 定义类型别名,简化类型名称的使用。
      • 解析 <typeHandlers> 元素: 注册自定义的类型处理器。
      • 解析 <objectFactory> 元素: 配置自定义的对象工厂。
      • 解析 <objectWrapperFactory> 元素: 配置自定义的对象包装工厂。
      • 解析 <reflectorFactory> 元素: 配置自定义的反射工厂。
      • 解析 <plugins> 元素: 注册插件 (拦截器)。
      • 解析 <environments> 元素: 配置 MyBatis 的运行环境 (例如 development, production)。
        • 解析 <environment> 元素: 配置具体的运行环境,包括 transactionManager (事务管理器) 和 dataSource (数据源)。
          • 解析 <transactionManager> 元素: 配置事务管理器 (例如 JDBC, MANAGED)。
          • 解析 <dataSource> 元素: 配置数据源 (例如 UNPOOLED, POOLED, JNDI),并设置数据源连接属性 (例如 driver, url, username, password)。
      • 解析 <mappers> 元素: 注册 Mapper 映射器。
        • 根据 <mapper> 元素的配置方式 (resource, url, class, package),加载 Mapper 映射文件或 Mapper 接口,并将 Mapper 信息添加到 Configuration 对象中。
          • 对于 XML Mapper 文件 (resource, url): 使用 XMLMapperBuilder 解析 Mapper XML 文件,并将 Mapper 语句 (SQL 映射) 解析到 Configuration 对象中。
          • 对于 Mapper 接口 (class, package): 将 Mapper 接口注册到 Configuration 对象中,后续在执行 SQL 时,MyBatis 会动态地为 Mapper 接口生成代理对象。
  • 3.3. 构建 SqlSessionFactory 实例:

    return build(configuration);
    
    • XMLConfigBuilder.parse() 方法最终会返回构建好的 Configuration 对象。
    • SqlSessionFactoryBuilder.build(InputStream inputStream) 方法内部会再次调用 build(configuration) 方法,将解析得到的 Configuration 对象传递给它。
    • SqlSessionFactoryBuilder.build(Configuration config) 方法会真正创建 DefaultSqlSessionFactory 实例,并将 Configuration 对象作为构造参数传入。
  • 3.4. 返回 SqlSessionFactory 实例:

    private SqlSessionFactory build(Configuration config) {
      return new DefaultSqlSessionFactory(config);
    }
    
    • SqlSessionFactoryBuilder.build(Configuration config) 方法会创建 DefaultSqlSessionFactory 实例,并将之前解析和构建的 Configuration 对象传递给 DefaultSqlSessionFactory 的构造器。
    • DefaultSqlSessionFactory 是 SqlSessionFactory 接口的默认实现类,它内部持有 Configuration 对象,并负责创建 SqlSession 实例。
    • SqlSessionFactoryBuilder.build() 方法最终会返回创建好的 SqlSessionFactory 实例。

4. SqlSessionFactory 的生命周期:

  • SqlSessionFactory 一旦被创建,应该在应用的整个生命周期内都存在。 最佳实践是在应用启动时创建 SqlSessionFactory,并将其作为单例 (Singleton) 对象进行管理和使用。
  • 在 Spring 环境中,SqlSessionFactory 通常由 Spring 容器管理,声明为 Spring Bean,并由 Spring 负责其生命周期管理。

总结 SqlSessionFactory 创建的关键步骤:

  1. 加载 MyBatis 配置信息 (XML 配置文件或 Java 代码配置)。
  2. 创建 SqlSessionFactoryBuilder 实例。
  3. 调用 SqlSessionFactoryBuilder.build() 方法,传入配置信息 (例如 InputStream 或 Configuration 对象)。
  4. SqlSessionFactoryBuilder.build() 内部:
    • 创建 XMLConfigBuilder (如果使用 XML 配置)。
    • XMLConfigBuilder 解析 XML 配置文件,构建并填充 Configuration 对象。
    • SqlSessionFactoryBuilder 使用 Configuration 对象创建 DefaultSqlSessionFactory 实例。
  5. 返回 SqlSessionFactory 实例。

SqlSessionFactory 的重要性:

  • SqlSession 工厂: SqlSessionFactory 是 SqlSession 的工厂,负责创建 SqlSession 实例。
  • 配置中心: SqlSessionFactory 内部持有 Configuration 对象,包含了 MyBatis 的所有配置信息 (数据源、事务管理器、Mapper 映射、全局设置等)。 Configuration 对象是 MyBatis 配置信息的中心仓库。
  • 性能优化: SqlSessionFactory 是重量级对象,创建过程相对耗时,但创建后可以重复使用,避免了每次数据库操作都重新解析配置和创建工厂的开销。 将其作为单例管理可以提高性能。
  • 线程安全: SqlSessionFactory 本身是线程安全的,可以被多个线程共享使用。 但 SqlSession 实例不是线程安全的,每个线程应该拥有自己的 SqlSession 实例。
Mybatis SqlSessionFactoryBuilder 创建 SqlSessionFactory执行过程 io读取mybatis-config.xml, 通过inputStream创建factory InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); factory = builder.build(is);//本次要看的方法 调用build() 全参方法 public SqlSess. 阅读详情

相关推荐

大众点评爬虫实战:如何用Python绕过反爬机制获取评论数据(附完整代码)

本文深入探讨了2024年使用Python进行大众点评数据采集的实战策略。文章详细解析了现代反爬机制的核心逻辑,并提供了从构建拟人化请求会话、应对动态内容与接口加密,到工程化实践(代理调度、状态持久化)的完整解决方案与代码示例,旨在帮助数据分析师稳健获取评论数据,用于后续的文本挖掘与商业洞察。

weixin_29084111的博客 1920

SqlSessionFactory介绍

SqlSessionFactory是MyBatis的关键字,它是单个数据库映射关系经过编译后的内存镜像,SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得,而SqlSessionFactoryBuildr则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例 每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory是线

weixin_45941064的博客 1万+

命令行驱动视频剪辑:cutcli与AI自动化工作流实战

在视频内容创作领域,自动化与批量化处理是提升生产效率的关键。传统图形界面工具在应对重复性任务时往往效率低下,而通过命令行接口(CLI)驱动视频生成,则能实现流程的程序化控制。其技术原理在于将视频结构抽象为可编程的指令序列,通过解析命令生成标准化的工程文件。这种模式的核心价值在于将视频制作从手动操作转变为代码驱动,特别适合与AI编程助手集成,实现自然语言到视频草稿的自动转换。应用场景广泛覆盖社交媒体内容批量生产、教育视频自动化生成、数据可视化视频组装等领域。本文以cutcli工具为例,深入解析如何通过命令行与

weixin_42520239的博客 577

SqlSessionFactory

SqlSessionFactory

Nana_Oyang的博客 3335

Databricks Genie:语义编译器架构与企业级智能解析实践

语义层是现代数据平台实现自然语言查询的核心基础,其本质是将业务术语映射为可执行、可治理的数据契约。原理上依赖结构化元数据、值字典与数据血缘三支柱协同,通过分层AI代理(如Intent Parsing、Retriever、Verifier)实现意图识别→语义对齐→安全执行的闭环。技术价值在于降低SQL使用门槛的同时保障审计性、一致性和权限可控性,适用于销售运营、财务分析等一线业务场景。本文深入解析Databricks Genie作为典型语义编译器的落地逻辑,涵盖Unity Catalog知识注入、七层Agen

weixin_29053695的博客 337

携程登录风控逆向踩坑实录:从滑块到点选验证码,我是如何一步步拿到phantom-token的

本文详细解析了携程登录风控系统的逆向过程,从滑块验证码到点选验证码的破解,再到设备指纹生成和加密协议逆向,最终成功获取phantom-token。文章提供了关键代码示例和实战技巧,帮助开发者理解并绕过复杂的风控机制。

weixin_28049429的博客 970

Mybatis之SqlSessionFactory详解

SqlSessionFactory详解

升仔聊编程的博客 2620

18、偏微分方程数值计算:粘性不可压缩流与电磁学的有限元方法

本文系统介绍了偏微分方程数值计算在粘性不可压缩流与电磁学中的应用,重点探讨了稳态与非稳态Navier-Stokes问题的混合有限元方法及求解技术,包括弱形式构建、半离散与时间离散格式、牛顿迭代法等。同时,详细阐述了电磁学中Maxwell方程的有限元与时域有限差分法(FDTD)求解方法,涵盖时间谐波与时域波方程、边界条件处理、稳定性分析与误差估计。结合MATLAB代码示例和实际案例,展示了速度场、压力、电场与磁场的数值模拟过程,并通过流程图与表格对比了两类问题的方法原理、应用场景与收敛性特性。最后展望了多物理

lemon的博客 88

mybatis 最常用的 SqlSessionFactory 和 SqlSession,你真的了解吗?

前言 学习框架一个比较好的路径阅读源码。本文介绍的SqlSessionFactory和SqlSession。可以通过了解SqlSessionFactory接口和SqlSession接口以及两个的实现类入手,去看源码了解实现过程。最好能把项目下载到本地,慢慢分析实现过程。 MyBatis的持久化解决方案是将用户从原始的JDBC访问中解放出来,用户只需要定义需要操作的SQL语句,无须关注底层的JDBC操作,就可以以面向对象的方式来进行持久化层操作。底层数据库连接的获取,数据访问的实现,事务控制等都无须用户关心

LoveSummer 5208

MCU-内部flash模拟成EepRom(重新梳理)

通过fee写数据Data的过程中,数据会mapping一个虚拟地址,这个虚拟地址就是你的身份,在向flash写数据的过程中会写入很多相同虚拟地址的不同数据,在读取或切页的过程中,遍历数据只会认为最下面第一个的虚拟地址所持有的数据是有效数据,其他的都是老数据,可以丢弃。模拟成eeprom的两个eep_page写数据逻辑就是,先在eep_page0写数据,eep_page0写满后,将eep_page0的有效数据copy到eep_page1,之后擦eep_page0;

xiandang8023的博客 711

基于MATLAB的语音声强度和响度分析及处理

综上所述,本文介绍了如何使用MATLAB进行语音信号的声强度和响度分析,并提供了相应的源代码。通过这些工具和方法,可以更好地理解和处理语音信号的声强度和响度特性,为语音信号处理和音频应用提供支持。声强度(Intensity)和响度(Loudness)是语音信号中常用的两个重要参数,用于描述声音的强度和感知响度。响度均衡化:可以通过对语音信号施加不同的加权滤波器,调整信号的频谱分布,从而改变声音的响度。除了分析语音信号的声强度和响度,MATLAB还提供了丰富的工具和函数,用于处理语音信号的声强度和响度。

COWizard的博客 617

sqlsessionfactory的作用_mybatis中SqlSessionFactory类创建过程

上一篇介绍了mybatis源码环境的搭建,今天就来开始看源码。mybatis执行主要流程上一篇文章中介绍的mybatis源码环境中的测试代码如下图:可以看到可mybatis相关的实际上就只有三步:创建SqlSessionFactory、通过SqlSessionFactory创建SqlSession、SqlSession执行selectOne方法。通过简单三步就实现了数据库的查询,今天就来分析第一步...

weixin_39922361的博客 761

Tesla v100 4张显卡组装机安装vllm和ollama在Ubuntu系统上的安装---AI大模型系统从零开始0032

本文提供Ubuntu22.04系统下vLLM的完整安装指南,适配4×32G Tesla显卡的单机4卡张量并行部署。教程包含:1)硬件要求(Ubuntu22.04、NVIDIA驱动≥535、CUDA12.1+);2)NVIDIA驱动自动安装方法;3)Python3.10虚拟环境配置;4)vLLM官方预编译包一键安装;5)单机4卡启动Qwen3.6-27B模型的完整参数说明(含FP8量化、多进程并行等关键配置)。文末附分布式部署的Ray集群方案参考链接,适用于多机8卡场景。

添柴程序猿的专栏 180

MyBatis的SqlSessionFactory的创建问题

MyBatis SqlSessionFactory Singleton

Dean Chen的专栏 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

mybatis创建SqlSessionFactory

mybatis是如何创建SqlSessionFactory的呢,请看下面入门示例

kookkj的博客 567

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

MyBatis创建SqlSessionFactory遇到问题

MyBatis遇到新手问题

qq_19780155的博客 1509

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Mybatis源码分析】01-SqlSessionFactory的创建过程

方法负责解析Mybatis配置文件的标签,将属性放入内存对象configuration中,通过Properties的putAll方法可以看出属性优先级,XMLConfigBuilder构造函数中传入的属性 > resource或url指定的属性 > 子标签的属性。可以看到调用了父类的构造方法,并传入一个new Configuration()对象,这个对象也就是最终的Mybatis配置对象,在看一下默认注册的TypeAlias,这个是TypeAliasRegistry对象构造函数默认注册的。

smart_an的专栏 1700

mybatis 创建SqlSessionFactory

创建SqlSessionFactory有两种方式:一种是通过XML,另一种是通过Java代码。 String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSess...

gaishi_hero的博客 733

mybatis源码学习-创建SqlSessionFactory

mybatis源码学习-创建SqlSessionFactory

qq_41683000的博客 1094

MyBatis SqlSessionFactory的几种常见创建方式

MyBatis框架主要是围绕着SqlSessionFactory这个类进行的,这个的创建过程如下: 定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象通过 SqlSessionFactoryBuilder 获得SqlSessionFacto

Lover 3万+

MyBatis源码系列之四:SqlSessionFactory的创建

欢迎来到MyBatis源码系列的第四篇文章。在前面的文章中,我们介绍了MyBatis的总览和环境准备,以及配置文件的解析过程。本篇文章将深入探讨MyBatis中SqlSessionFactory的创建过程,这是MyBatis框架中非常重要的一部分。

Dingxiaowei77的专栏 1165

mybatis源码之创建SqlSessionFactory代码分析

这个mybatis源码分析系列会尽量全面地分析mybatis的核心执行流程、与springboot的集成流程。 待分析的课题 xml mapper独立使用源码分析 mapper接口独立使用源码分析 springboot集成源码分析 mybatis-plus核心源码分析 mybatis-plus与springboot集成源码分析 环境准备 开发环境 windows 10 java 1.8 mybatis版本 mybatis 3.5.6依赖: <dependency> <groupId

xuguofeng2016的博客 1191

mybatis源码阅读之SqlSessionFactory创建

Mybatis源码阅读,关于如何创建SqlSessionFactory。

liuffei的专栏 596

Mybatis(二) - Mybatis是如何创建出SqlSessionFactory的

Mybatis(二) 如何创建出SqlSessionFactory 本篇文章是通过看视频学习总结的内容, 如有错误的地方请谅解,并联系博主及时修改,谢谢您的阅读. 从Junit 测试类进入Mybatis 源码中 @Before public void prepare() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResource

qq_38800175的博客 679
上一篇: MyBatis 如何创建 SqlSession 对象的?
下一篇: ApplicationContext 如何解析 Bean 定义
冰糖心书房
博客等级 码龄15年 6016粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值