首页 > 数据库 >MyBatis 源码解析:DefaultSqlSession 功能解析

MyBatis 源码解析:DefaultSqlSession 功能解析

时间:2024-09-03 22:23:59浏览次数:15  
标签:String DefaultSqlSession SqlSession 源码 statement SQL MyBatis 解析 public

摘要

DefaultSqlSession 是 MyBatis 中的核心类,负责执行 SQL 语句和管理事务。在日常开发中,我们经常会通过 SqlSession 来执行数据库的增删改查操作。你是否想深入了解 DefaultSqlSession 的内部实现机制?本文将通过自定义实现一个 DefaultSqlSession 类,带你全面解析 MyBatis 中的 SQL 执行和事务管理机制,并帮助你更好地掌握 SqlSession 的工作原理。


前言

DefaultSqlSession 是 MyBatis 框架中的关键组件之一,它封装了对数据库的所有操作,并负责管理 SQL 的执行和事务的处理。理解 DefaultSqlSession 的功能实现,有助于深入掌握 MyBatis 的工作原理。本文将通过自定义实现一个简化版的 DefaultSqlSession 类,并对 MyBatis 的 DefaultSqlSession 进行源码解析,帮助你全面理解其功能和实现。


自定义实现:简化版 DefaultSqlSession

目标与功能

我们将实现一个简化版的 DefaultSqlSession 类,该类将支持执行 SQL 语句、管理事务和关闭资源。通过这个实现,我们可以更好地理解 MyBatis 是如何设计和管理数据库操作的。

核心流程

  1. 执行 SQL 语句:提供执行 SQL 语句的方法,支持基本的增删改查操作。
  2. 事务管理:支持事务的提交、回滚和管理。
  3. 资源管理:确保 SqlSession 使用后能够正确关闭资源。

实现过程

1. 定义 SqlSession 接口

我们首先定义 SqlSession 接口,包含了基本的 SQL 执行和事务管理方法。

/**
 * SqlSession 接口,定义了 MyBatis 中执行 SQL 的核心操作。
 * 包括增删改查方法和事务管理方法。
 */
public interface SqlSession {
    <T> T selectOne(String statement);

    int insert(String statement);

    int update(String statement);

    int delete(String statement);

    void commit();

    void rollback();

    void close();
}
2. 实现 DefaultSqlSession 类

DefaultSqlSession 类是 SqlSession 接口的一个实现类,负责具体执行 SQL 语句,并管理事务和资源。

import java.sql.Connection;
import java.sql.Statement;
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;
    }

    @Override
    public <T> T selectOne(String statement) {
        return executeQuery(statement);
    }

    @Override
    public int insert(String statement) {
        return executeUpdate(statement);
    }

    @Override
    public int update(String statement) {
        return executeUpdate(statement);
    }

    @Override
    public int delete(String statement) {
        return executeUpdate(statement);
    }

    private <T> T executeQuery(String statement) {
        try (Statement stmt = connection.createStatement()) {
            System.out.println("Executing query: " + statement);
            stmt.execute(statement);
            // 简化的实现,实际操作中应包括结果集处理
            return null;
        } catch (SQLException e) {
            throw new RuntimeException("Error executing query", e);
        }
    }

    private int executeUpdate(String statement) {
        try (Statement stmt = connection.createStatement()) {
            System.out.println("Executing update: " + statement);
            return stmt.executeUpdate(statement);
        } catch (SQLException e) {
            throw new RuntimeException("Error executing update", e);
        }
    }

    @Override
    public void commit() {
        try {
            if (!autoCommit) {
                connection.commit();
            }
        } catch (SQLException e) {
            throw new RuntimeException("Failed to commit transaction", e);
        }
    }

    @Override
    public void rollback() {
        try {
            if (!autoCommit) {
                connection.rollback();
            }
        } catch (SQLException e) {
            throw new RuntimeException("Failed to rollback transaction", e);
        }
    }

    @Override
    public void close() {
        try {
            connection.close();
        } catch (SQLException e) {
            throw new RuntimeException("Failed to close connection", e);
        }
    }
}
  • executeQuery 方法:负责执行 SELECT 查询,并返回结果集(这里的实现进行了简化,未返回实际数据)。
  • executeUpdate 方法:负责执行 INSERTUPDATEDELETE 操作,并返回影响的行数。
  • commitrollback 方法:用于事务管理,根据 autoCommit 的设置决定是否自动提交或回滚事务。
  • close 方法:负责关闭数据库连接,确保资源不被泄露。
3. 测试 DefaultSqlSession

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

import java.sql.Connection;
import java.sql.DriverManager;

public class DefaultSqlSessionTest {
    public static void main(String[] args) {
        try {
            // 模拟数据库连接
            Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", "");

            // 初始化 SqlSession
            DefaultSqlSession sqlSession = new DefaultSqlSession(new Configuration(), connection, false);

            // 执行 SQL 操作
            sqlSession.insert("INSERT INTO users (name, age) VALUES ('John', 30)");
            sqlSession.update("UPDATE users SET age = 31 WHERE name = 'John'");
            sqlSession.selectOne("SELECT * FROM users WHERE name = 'John'");
            sqlSession.delete("DELETE FROM users WHERE name = 'John'");

            // 提交事务
            sqlSession.commit();

            // 关闭资源
            sqlSession.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

自定义实现类图

Configuration - EnvironmentConfig environmentConfig +getEnvironmentConfig() +setEnvironmentConfig(EnvironmentConfig) «interface» SqlSession +selectOne(String statement) +int insert(String statement) +int update(String statement) +int delete(String statement) +commit() +rollback() +close() DefaultSqlSession - Configuration configuration - Connection connection - boolean autoCommit +selectOne(String statement) +int insert(String statement) +int update(String statement) +int delete(String statement) +commit() +rollback() +close() Connection EnvironmentConfig

代码解析流程图

开始 初始化 SqlSession 执行 SQL 操作 是否自动提交? 提交或回滚事务 直接返回结果 关闭 SqlSession 并释放资源 结束

源码解析:MyBatis 中的 DefaultSqlSession

1. DefaultSqlSession 的设计与实现

在 MyBatis 中,DefaultSqlSessionSqlSession 的默认实现类,负责执行 SQL 语句并管理事务。它使用 Executor 对象执行具体的 SQL 操作,并将结果映射到 Java 对象中。

public class DefaultSqlSession implements SqlSession {
    private final Configuration configuration;
    private final Executor executor;
    private final boolean autoCommit;

    public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
        this.configuration = configuration;
        this.executor = executor;
        this.autoCommit = autoCommit;
    }

    @Override
    public <T> T selectOne(String statement, Object parameter) {
        List<T> list = this.selectList(statement, parameter);
        if (list.size() == 1) {
            return list.get(0);
        } else if (list.size() > 1) {
            throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
        } else {
            return null;
        }
    }

    // 其他 CRUD 方法的实现...
}
  • Executor 对象:负责执行 SQL 语句,并将结果映射到 Java 对象中。
  • selectOne 方法:执行 SELECT 操作,并返回单个结果。如果结果集包含多条数据,则抛出 TooManyResultsException 异常。

2. 事务管理与资源管理

DefaultSqlSession 提供了 commitrollback 方法来处理事务,并提供 close 方法来关闭数据库连接和释放资源。在 MyBatis 中,事务管理是确保数据一致性的重要机制,资源管理则确保数据库连接等资源在使用后能够及时释放,避免资源泄漏。

@Override
public void commit() {
    try {
        executor.commit(isTransactionOpen(), false);
    } catch (SQLException e) {
        throw new RuntimeException("Failed to commit transaction", e);
    }
}

@Override
public void rollback() {
    try {
        executor.rollback(isTransactionOpen());
    } catch (SQLException e) {
        throw new RuntimeException("Failed to rollback transaction", e);
    }
}

@Override
public void close() {
    try {
        executor.close(isTransactionOpen());
    } catch (SQLException e) {
        throw new RuntimeException("Failed to close session", e);
    }
}
  • commit 方法:提交当前事务。如果 autoCommitfalse,则手动提交事务。
  • rollback 方法:回滚当前事务。如果 autoCommitfalse,则手动回滚事务。
  • close 方法:关闭当前 SqlSession,释放资源,包括关闭数据库连接和清理缓存。

3. MyBatis 中 DefaultSqlSession 的工作流程

DefaultSqlSession 的工作流程可以总结为以下几个步骤:

  1. 初始化 SqlSession:创建 SqlSession 时,初始化数据库连接和执行器,并根据配置决定是否启用自动提交。
  2. 执行 SQL 操作:调用 selectOneinsertupdatedelete 等方法执行具体的 SQL 操作,并返回结果。
  3. 事务管理:根据需要调用 commitrollback 方法进行事务管理,确保数据的一致性。
  4. 资源管理:操作完成后,调用 close 方法关闭 SqlSession,释放资源,防止资源泄漏。

总结与互动

通过本文,我们详细探讨了 MyBatis 中 DefaultSqlSession 的设计与实现,并通过自定义实现加深了对 SqlSession 核心功能的理解。掌握这些知识有助于在开发中更好地管理数据库操作,确保事务的正确性和资源的有效管理。

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


标签:String,DefaultSqlSession,SqlSession,源码,statement,SQL,MyBatis,解析,public
From: https://blog.csdn.net/qq_40254606/article/details/141829546

相关文章

  • Mybatis学习笔记
    本笔记基于【尚硅谷新版SSM框架全套视频教程,Spring6+SpringBoot3最新SSM企业级开发】https://www.bilibili.com/video/BV1AP411s7D7?vd_source=a91dafe0f846ad7bd19625e392cf76d8总结资料获取网址:https://www.wolai.com/v5Kuct5ZtPeVBk4NBUGBWFMyBatis实践:提高持久层数据......
  • mybatis-plus批量增加、批量修改样例+建表语句+postman接口
    使用mybatis-plus开发中会遇到数据量多的情况下,插入和修改效率低,主要原因是“新增“和“修改”方法是对一条数据进行处理的,如果有一万条数据就会和数据库交互一万次所以效率就低。如何提高效率就需要批量操作,如下展示批量插入和批量修改的代码,数据库使用mysql。1、建表语句CREA......
  • 【C++】_vector定义、_vector常用方法解析
    不管心情如何,不论今天过得怎么样,无论身在何方,请记得...微笑!......
  • 【前端面试】采用react前后,浏览器-解析渲染UI的变化
    浏览器渲染html浏览器解析和渲染UI(用户界面),特别是HTML文档,是一个复杂的过程,涉及到多个阶段。以下是浏览器从接收HTML文档到显示渲染后的页面的一般步骤:1.下载HTML文档:用户输入URL或点击链接时,浏览器会向服务器请求HTML文档。服务器响应请求,并将HTML文档......
  • 《深度学习》OpenCV轮廓检测 轮廓近似、模板匹配 解析及实现
    一、轮廓近似1、什么是轮廓近似        指对轮廓进行逼近或拟合,得到近似的轮廓。在图像处理中,轮廓表示了图像中物体的边界,因此轮廓近似可以用来描述和识别物体的形状。2、参数解析1)用法importcv2approx=cv2.approxPolyDP(curve,epsilon,closed)2)参数 ......
  • java 架构师课程资源(资料加源码加课件)
    java架构师课程全程班jvm底层加载内存池与jvm模型垃圾回收器垃圾算法阻塞队列底层源码spring zookeeper等等,需要的话自己点开查看夸克链接https://pan.quark.cn/s/0260673a6657​​​​​​   ......
  • MyBatis 一级缓存原理
    优质博文:IT-BLOG-CN一、一级缓存配置MyBatis一级缓存默认是开启的。如果需要显示的开启,需要在MyBaits配置文件中<settings>标签中添加如下语句:<settings> <settingname="localCacheScope"value="SESSION"/></settings>value共有两个选项,SESSION或者STATEMENT,默认是......
  • 干货含源码!如何用Java后端操作Docker(命令行篇)
    目录干货含源码!如何用Java后端操作Docker(命令行篇)一、为什么要用后端程序操作Docker二、安装Docker1、安装Docker2、启动Docker三、使用Java后端操作docker1、构建docker镜像并生成容器2、执行完毕后删除容器和镜像3、在此基础上开发其他功能四、总结作者:watermel......
  • 【Spring Boot】整合MyBatis
    **整合MyBatis**前言SpringBoot和MyBatis都是非常流行的Java框架。SpringBoot简化了Spring应用的开发,而MyBatis则是一个优秀的持久层框架,支持自定义SQL、存储过程以及高级映射。mybatis官方文档:http://mybatis.org/spring-boot-starter/myba......
  • 全面解析智慧医院:从建设到应用的全新视角
    智慧医院是什么?智慧医院是一种新型的医疗机构,它利用先进的信息技术、数据分析和智能化系统,优化医院的管理和服务流程,提高医疗质量和效率。在智慧医院中,所有的运营和管理环节都可以通过数据驱动的方式来实现优化,从而使医院的服务更精准、更高效。智慧医院不仅仅是引入电子病历、......