MyBatis 如何创建 SqlSession 对象的?

devtools/2025/3/17 16:54:52/

MyBatis 创建 SqlSession 对象的过程主要由 SqlSessionFactory 接口及其实现类来完成。以下是详细步骤:

1. SqlSessionFactory 接口:

  • SqlSessionFactory 是 MyBatis 的核心接口之一,它负责创建 SqlSession 对象。 你可以将 SqlSessionFactory 视为 SqlSession 的工厂。
  • SqlSessionFactory 接口定义了多个 openSession() 方法,用于创建 SqlSession。这些方法提供了不同的选项,例如:
    * openSession(): 使用默认配置(通常是不自动提交事务)。
    * openSession(boolean autoCommit): 指定是否自动提交事务。
    * openSession(ExecutorType execType): 指定执行器类型 (SIMPLE, REUSE, BATCH)。
    * openSession(TransactionIsolationLevel level): 指定事务隔离级别。
    * openSession(Connection connection): 使用外部提供的数据库连接。

2. SqlSessionFactoryBuilder:

  • SqlSessionFactoryBuilder 是一个构建器类,用于构建 SqlSessionFactory 实例。
  • 它提供了多个 build() 方法,可以通过以下方式构建 SqlSessionFactory
    * 从 XML 配置文件 (mybatis-config.xml) 构建。
    * 从 Configuration 对象构建。
    * 从 InputStreamReader 构建。
// 从 XML 配置文件构建 SqlSessionFactory (最常见的方式)
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 从 Configuration 对象构建 SqlSessionFactory
Configuration configuration = new Configuration();
// ... 添加配置信息 ...
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
  • SqlSessionFactoryBuilder 在构建完 SqlSessionFactory 后,其自身的使命就完成了,通常不需要保留它的实例。最佳实践是在方法内部创建 SqlSessionFactoryBuilder,构建 SqlSessionFactory,然后丢弃 SqlSessionFactoryBuilder

3. DefaultSqlSessionFactory (默认实现):

  • DefaultSqlSessionFactorySqlSessionFactory 接口的默认实现类。
  • SqlSessionFactoryBuilderbuild() 方法通常会创建一个 DefaultSqlSessionFactory 实例。

4. openSession() 方法 (创建 SqlSession 的核心):

  • DefaultSqlSessionFactoryopenSession() 方法(及其重载方法)负责创建 SqlSession 对象。
  • 创建 SqlSession 的过程大致如下:
  1. 获取 Environment:Configuration 对象中获取 Environment 对象,Environment 对象包含了数据源、事务管理器等信息
  2. 创建 Transaction: 根据 Environment 中的 TransactionFactory 创建 Transaction 对象。Transaction 对象负责管理数据库事务。
  3. 创建 Executor: 根据配置信息(例如,defaultExecutorType 设置)和 Transaction 对象创建 Executor 对象。Executor 负责执行 SQL 语句,并处理缓存。
  4. 创建 DefaultSqlSession: 创建 DefaultSqlSession 对象,并将 ConfigurationExecutorautoCommit 标志(是否自动提交事务)传递给 DefaultSqlSession 的构造函数。
  5. 返回 DefaultSqlSession: openSession() 方法返回新创建的 DefaultSqlSession 对象。
    // DefaultSqlSessionFactory 的 openSessionFromDataSource() 方法 (简化版)
    private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {Transaction tx = null;try {final Environment environment = configuration.getEnvironment();final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);final Executor executor = configuration.newExecutor(tx, execType);return new DefaultSqlSession(configuration, executor, autoCommit);} catch (Exception e) {closeTransaction(tx); // may have fetched a connection so lets call close()throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);} finally {ErrorContext.instance().reset();}
    }
    

5. DefaultSqlSession:

  • DefaultSqlSessionSqlSession 接口的默认实现类。
  • 它包含了执行 SQL 语句、获取 Mapper 接口实例、管理事务等方法。
  • DefaultSqlSession 内部持有 Configuration 对象、Executor 对象和 autoCommit 标志。

总结:

MyBatis 创建 SqlSession 对象的过程如下:

  1. SqlSessionFactoryBuilder 构建 SqlSessionFactory (通常是 DefaultSqlSessionFactory)。
  2. 调用 SqlSessionFactoryopenSession() 方法。
  3. DefaultSqlSessionFactory 创建 TransactionExecutorDefaultSqlSession 对象。
  4. openSession() 方法返回 DefaultSqlSession 对象。

SqlSessionFactorySqlSession 的工厂,DefaultSqlSessionFactorySqlSessionFactory 的默认实现,DefaultSqlSessionSqlSession 的默认实现。SqlSessionFactoryBuilder 用于构建 SqlSessionFactory


http://www.ppmy.cn/devtools/167875.html

相关文章

【机器学习-基础知识】统计和贝叶斯推断

1. 概率论基本概念回顾 1. 概率分布 定义: 概率分布(Probability Distribution)指的是随机变量所有可能取值及其对应概率的集合。它描述了一个随机变量可能取的所有值以及每个值被取到的概率。 对于离散型随机变量,使用概率质量函数来描述。对于连续型随机变量,使用概率…

电路原理(电容 集成电路NE555)

电容 1.特性:充放电,隔直流,通交流 2.电容是通过聚集正负电荷来存储电能的 3.电容充放电过程可等效为导通回路 4.多电容并联可以把容量叠加,但是多电容串联就不会,只会叠加电容的耐压值。 6.电容充放电时相当于通路&a…

【SpringBoot】最佳实践——JWT结合Redis实现双Token无感刷新

JWT概览 JWT概念 JWT是全称是JSON WEB TOKEN,是一个开放标准,用于将各方数据信息作为JSON格式进行对象传递,可以对数据进行可选的数字加密,可使用RSA或ECDSA进行公钥/私钥签名。JWT最常见的使用场景就是缓存当前用户登录信息&am…

数学建模 第一节

目录​​​​​​ 前言 一 优化模型的类型 二 线性规划1 线性规划2 三 0-1规划 总结 前言 数学建模主要是将问题转化为模型,然后再以编程的形式输出出来 算法都知道,数学建模也需要用到算法,但是不是主要以编程形式展示,而是…

【后端】【django drf】Django DRF API 编写规范(程序设计规则)

Django DRF API 编写规范(程序设计规则) 为了确保 Django DRF 代码的可维护性、可扩展性和高质量,API 设计不仅要符合 RESTful 规范,还需要遵循一定的程序设计规则。以下是一些关键的编写规范,以保证代码的清晰性、可…

DeepSeek R1 与 ktransformers:结合苹果 M4 Mac 的 LLM 推理深度分析

引言 大型语言模型(LLM)的快速发展为人工智能领域带来了革命性变化。DeepSeek R1 和 ktransformers 代表了软件层面的最新突破,而苹果在 2025 年 3 月 12 日发布的 M4 Mac 系列则提供了硬件支持。本文将深入分析这些技术的交汇点&#xff0c…

Git版本控制系统详解

文章目录 一、Git简介二、Git的基本原理三、Git的安装与配置安装配置 四、Git常用指令详解1. git init2. git clone3. git add4. git commit5. git status6. git diff7. git log8. git branch9. git checkout10. git merge11. git pull12. git push 五、Git的进阶用法1. 远程仓…

animes 和 css对比

Anime.js 并不是纯粹的 CSS 动画库,而是一个基于 JavaScript 的动画库。它可以通过操作 DOM 元素的属性(如 style、transform、opacity 等)来实现动画效果。虽然 Anime.js 的某些功能与 CSS 动画类似,但它的工作原理和功能范围与 …