当前位置: 首页 > news >正文

MyBatis 源码解析:DefaultSqlSessionFactory 的创建与管理

摘要

在 MyBatis 中,SqlSessionFactory 是执行数据库操作的核心对象,它负责创建和管理 SqlSession 的生命周期。你是否想了解 SqlSessionFactory 的创建和管理过程?本文将通过自定义实现一个简化版的 DefaultSqlSessionFactory,带你深入探讨 MyBatis 中 DefaultSqlSessionFactory 的创建与管理机制,并帮助你更好地掌握 SqlSession 的创建和管理流程。


前言

DefaultSqlSessionFactory 是 MyBatis 提供的 SqlSessionFactory 的默认实现类,它负责根据 Configuration 对象生成 SqlSession,并管理 SqlSession 的生命周期。理解 DefaultSqlSessionFactory 的创建与管理,有助于深入掌握 MyBatis 的数据库操作机制。本文将通过自定义实现一个简化版的 DefaultSqlSessionFactory,并深入解析 MyBatis 中 DefaultSqlSessionFactory 的实现细节。


自定义实现:简化版 DefaultSqlSessionFactory

目标与功能

我们将实现一个简化版的 DefaultSqlSessionFactory,该工厂类将负责管理 SqlSession 的创建、事务的处理以及资源的管理。通过这个实现,我们可以更好地理解 MyBatis 是如何管理 SqlSession 的生命周期。

核心流程

  1. 创建 SqlSession:根据传入的配置创建 SqlSession 对象。
  2. 管理事务:确保在 SqlSession 的整个生命周期内正确地管理事务。
  3. 关闭资源:在 SqlSession 关闭时,确保所有资源被正确释放。

实现过程

1. 定义 SqlSessionFactory 接口

我们定义一个 SqlSessionFactory 接口,用于生成 SqlSession 对象,并为事务和资源管理提供支持。

/*** SqlSessionFactory 接口,用于生成 SqlSession 对象。*/
public interface SqlSessionFactory {SqlSession openSession();SqlSession openSession(boolean autoCommit);
}
2. 实现 DefaultSqlSessionFactory 类

DefaultSqlSessionFactorySqlSessionFactory 的一个默认实现类,我们将其设计为基于 Configuration 对象生成 SqlSession 对象,并管理事务和资源。

/*** DefaultSqlSessionFactory 类是 SqlSessionFactory 的一个简化实现。* 它基于 Configuration 配置生成 SqlSession 对象,并管理 SqlSession 的生命周期。*/
public class DefaultSqlSessionFactory implements SqlSessionFactory {private final Configuration configuration;public DefaultSqlSessionFactory(Configuration configuration) {this.configuration = configuration;}@Overridepublic SqlSession openSession() {return openSession(false); // 默认不开启自动提交}@Overridepublic SqlSession openSession(boolean autoCommit) {// 获取数据源,打开数据库连接Connection connection = getConnection(configuration.getEnvironmentConfig().getDataSourceConfig());// 创建并返回一个新的 SqlSessionreturn new DefaultSqlSession(configuration, connection, autoCommit);}/*** 获取数据库连接。* * @param dataSourceConfig 数据源配置* @return 数据库连接对象*/private Connection getConnection(DataSourceConfig dataSourceConfig) {try {// 创建并返回一个数据库连接(简化版,实际应考虑连接池等管理)Class.forName(dataSourceConfig.getProperties().get("driver"));return DriverManager.getConnection(dataSourceConfig.getProperties().get("url"),dataSourceConfig.getProperties().get("username"),dataSourceConfig.getProperties().get("password"));} catch (Exception e) {throw new RuntimeException("Failed to get database connection", e);}}
}
3. 实现 DefaultSqlSession 类

DefaultSqlSession 类是 SqlSession 接口的一个实现类,负责执行 SQL 操作,并管理事务和资源的关闭。

import java.sql.Connection;
import java.sql.SQLException;/*** DefaultSqlSession 是 SqlSession 接口的一个简化实现。* 它基于 Configuration 配置执行 SQL 操作,并管理事务和资源。*/
public class DefaultSqlSession implements SqlSession {private final Configuration configuration;private final Connection connection;private final boolean autoCommit;public DefaultSqlSession(Configuration configuration, Connection connection, boolean autoCommit) {this.configuration = configuration;this.connection = connection;this.autoCommit = autoCommit;}@Overridepublic <T> T selectOne(String statement) {// 简化的 SQL 执行逻辑,实际操作中应包括 SQL 编译、执行和结果映射等System.out.println("Executing SQL statement: " + statement);return null;}/*** 提交事务。*/public void commit() {try {if (!autoCommit) {connection.commit();}} catch (SQLException e) {throw new RuntimeException("Failed to commit transaction", e);}}/*** 回滚事务。*/public void rollback() {try {if (!autoCommit) {connection.rollback();}} catch (SQLException e) {throw new RuntimeException("Failed to rollback transaction", e);}}/*** 关闭 SqlSession 并释放资源。*/@Overridepublic void close() {try {connection.close();} catch (SQLException e) {throw new RuntimeException("Failed to close connection", e);}}
}
4. 测试 DefaultSqlSessionFactory

我们编写一个简单的测试类来验证 DefaultSqlSessionFactory 的功能。

import java.io.InputStream;public class DefaultSqlSessionFactoryTest {public static void main(String[] args) {// 读取 MyBatis 配置文件InputStream inputStream = DefaultSqlSessionFactoryTest.class.getResourceAsStream("/mybatis-config.xml");// 使用 SqlSessionFactoryBuilder 构建 SqlSessionFactorySqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();SqlSessionFactory factory = builder.build(inputStream);// 获取 SqlSession 并执行查询操作SqlSession session = factory.openSession();try {session.selectOne("com.example.mapper.selectById");session.commit(); // 提交事务} finally {session.close(); // 关闭资源}}
}

自定义实现类图

Configuration
- EnvironmentConfig environmentConfig
+getEnvironmentConfig()
+setEnvironmentConfig(EnvironmentConfig)
«interface»
SqlSessionFactory
+openSession()
+openSession(boolean autoCommit)
DefaultSqlSessionFactory
- Configuration configuration
+openSession()
+openSession(boolean autoCommit)
-getConnection(DataSourceConfig)
«interface»
SqlSession
+selectOne(String statement)
+commit()
+rollback()
+close()
DefaultSqlSession
- Configuration configuration
- Connection connection
- boolean autoCommit
+selectOne(String statement)
+commit()
+rollback()
+close()
Connection
EnvironmentConfig

代码解析流程图

开始
创建 SqlSessionFactory
获取数据库连接
创建 SqlSession
执行 SQL 操作
是否自动提交?
提交事务
关闭 SqlSession 并释放资源
结束

源码解析:MyBatis 中的 DefaultSqlSessionFactory

1. DefaultSqlSessionFactory 的创建

在 MyBatis 中,DefaultSqlSessionFactorySqlSessionFactory 的默认实现类,它根据 Configuration 对象创建 SqlSession,并管理事务和资源。

public class DefaultSqlSessionFactory implements SqlSessionFactory {private final Configuration configuration;public DefaultSqlSessionFactory(Configuration configuration) {this.configuration = configuration;}@Overridepublic SqlSession openSession() {return openSession(false);}@Overridepublic SqlSession openSession(boolean autoCommit) {Connection connection = transactionFactory.newTransaction(environment.getDataSource(), autoCommit).getConnection();return new DefaultSqlSession(configuration, connection, autoCommit);}
}
  • Configuration 对象:包含了 MyBatis 的所有配置信息,是 SqlSessionFactory 创建 SqlSession 的核心依赖。
  • openSession 方法:根据配置创建一个新的 SqlSession 对象,并管理事务。

2. SqlSession 的管理

SqlSession 是 MyBatis 执行 SQL 操作的核心对象,它负责在数据库上执行 CRUD 操作,并管理事务的提交、回滚和资源的关闭。在 DefaultSqlSessionFactory 中,SqlSession 的管理主要通过以下几个方面来实现:

  • 创建 SqlSession:每次调用 openSession 时,DefaultSqlSessionFactory 会创建一个新的 SqlSession 对象,并根据配置决定是否开启自动提交事务。
  • 事务管理SqlSession 对象会根据是否自动提交的配置,决定是否在每次操作后立即提交事务,或者由用户手动管理事务的提交和回滚。
  • 资源管理:在 SqlSessionclose 方法中,负责释放数据库连接和其他资源,确保系统资源的正确管理。

3. 事务管理与资源管理

在 MyBatis 中,事务管理和资源管理是 SqlSession 的重要职责。在默认实现中,事务管理的核心逻辑体现在 commitrollback 方法中,而资源管理则体现在 close 方法中。

public class DefaultSqlSession implements SqlSession {private final Configuration configuration;private final Connection connection;private final boolean autoCommit;public DefaultSqlSession(Configuration configuration, Connection connection, boolean autoCommit) {this.configuration = configuration;this.connection = connection;this.autoCommit = autoCommit;}@Overridepublic <T> T selectOne(String statement) {// 简化的 SQL 执行逻辑,实际操作中应包括 SQL 编译、执行和结果映射等System.out.println("Executing SQL statement: " + statement);return null;}/*** 提交事务。*/public void commit() {try {if (!autoCommit) {connection.commit();}} catch (SQLException e) {throw new RuntimeException("Failed to commit transaction", e);}}/*** 回滚事务。*/public void rollback() {try {if (!autoCommit) {connection.rollback();}} catch (SQLException e) {throw new RuntimeException("Failed to rollback transaction", e);}}/*** 关闭 SqlSession 并释放资源。*/@Overridepublic void close() {try {connection.close();} catch (SQLException e) {throw new RuntimeException("Failed to close connection", e);}}
}
  • commit 方法:负责将事务提交到数据库,如果未开启自动提交,则手动提交事务。
  • rollback 方法:当事务需要回滚时调用,如果未开启自动提交,则手动回滚事务。
  • close 方法:负责关闭数据库连接和释放其他资源,确保在 SqlSession 使用完毕后不会造成资源泄露。

4. DefaultSqlSessionFactory 的完整流程

DefaultSqlSessionFactory 的完整工作流程可以总结为以下步骤:

  1. 初始化 Configuration 对象:在构造 DefaultSqlSessionFactory 时,传入 Configuration 对象,保存 MyBatis 的全局配置信息。
  2. 打开 SqlSession:调用 openSession 方法时,根据配置决定是否开启自动提交事务,并创建一个新的 SqlSession 对象。
  3. 执行 SQL 操作:使用 SqlSession 对象执行 SQL 操作,并管理事务的提交和回滚。
  4. 关闭 SqlSession:操作完成后,调用 close 方法关闭 SqlSession,释放数据库连接和其他资源。

总结与互动

通过本文,我们详细探讨了 MyBatis 中 DefaultSqlSessionFactory 的创建与管理,并通过自定义实现加深了对 SqlSession 生命周期管理的理解。掌握这些知识有助于在开发中更好地管理数据库操作和事务控制,提升应用程序的健壮性和可维护性。

如果您觉得这篇文章对您有帮助,请点赞、收藏并关注!此外,欢迎在评论区留言,与我们分享您的见解或提出疑问!


这篇文章通过自定义实现和源码解析,帮助读者深入理解 MyBatis 中 DefaultSqlSessionFactory 的创建与管理机制。希望这些内容对您有所帮助!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于QT与STM32的电力参数采集系统(华为云IOT)(211)
  • 面试经验分享 | 华为安全面试--年薪50万offer
  • MySQL中的分组统计
  • 记一次ssh伪终端修改为shell
  • 案例-KVM高级功能部署(虚拟化技术实战)
  • nuxt3连接mongodb操作
  • 线性代数 第五讲:线性方程组_齐次线性方程组_非齐次线性方程组_公共解同解方程组_详解
  • k8s-pod 实战八 (gRPC 探测详细分析)
  • Linux虚拟机搭建K8S环境
  • pbds库
  • Python 从入门到实战5(列表的其它操作)
  • Gazebo Harmonic gz-harmonic 和 ROS2 Jazzy 思考题 建图和导航 SLAM Navigation
  • 微信小程序知识点(一)
  • 视频压缩工具哪个好?无损压缩工具分享
  • C语言:基本数据类型 char, short int, int
  • 「面试题」如何实现一个圣杯布局?
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Angular Elements 及其运作原理
  • Date型的使用
  • Java Agent 学习笔记
  • JavaScript类型识别
  • maven工程打包jar以及java jar命令的classpath使用
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • VuePress 静态网站生成
  • webpack项目中使用grunt监听文件变动自动打包编译
  • WePY 在小程序性能调优上做出的探究
  • 后端_ThinkPHP5
  • 学习ES6 变量的解构赋值
  • 源码安装memcached和php memcache扩展
  • 怎么将电脑中的声音录制成WAV格式
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​Redis 实现计数器和限速器的
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • (11)MSP430F5529 定时器B
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (四)linux文件内容查看
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (一)Neo4j下载安装以及初次使用
  • **CI中自动类加载的用法总结
  • .axf 转化 .bin文件 的方法
  • .naturalWidth 和naturalHeight属性,
  • .NET C# 使用 iText 生成PDF
  • .NET 使用配置文件
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .net6Api后台+uniapp导出Excel
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET企业级应用架构设计系列之技术选型
  • .NET企业级应用架构设计系列之开场白
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布
  • [ActionScript][AS3]小小笔记
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术