【手把手带你玩转MyBatis】深入源码解读MyBatis系列(二):SqlSession与Executor的交互机制

本文主要是介绍【手把手带你玩转MyBatis】深入源码解读MyBatis系列(二):SqlSession与Executor的交互机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

在上一篇中,我们详细剖析了MyBatis如何通过SqlSessionFactoryBuilder解析配置文件并创建出SqlSessionFactory。本篇将继续深入MyBatis的核心运行机制,聚焦于SqlSessionExecutor这两个关键组件之间的协作关系,揭示它们是如何共同完成对数据库操作请求的处理。

1. SqlSession的角色与功能

SqlSession 是MyBatis对外提供的主要API,它代表了一个与数据库的会话,提供了执行SQL、获取映射结果以及管理事务的方法。每个SqlSession实例都与一个数据库连接关联,并且内部持有Executor对象来实际执行SQL语句。

// 从SqlSessionFactory获取SqlSession实例
SqlSession sqlSession = sqlSessionFactory.openSession();try {// 使用SqlSession执行SQL并获取结果User user = sqlSession.selectOne("org.mybatis.example.UserMapper.selectById", 1);
} finally {// 关闭SqlSession以释放资源sqlSession.close();
}

核心方法

  • select*: 执行查询语句,返回映射后的对象或集合。
  • insert, update, delete: 执行增删改操作。
  • commit, rollback: 提交或回滚事务。

2. Executor的类型及其职责

Executor 在MyBatis中扮演着SQL执行器的角色,它是所有数据库操作的实际执行者。MyBatis内置了两种类型的执行器:

  • SimpleExecutor: 简单执行器,每次执行SQL都会开启一个新的预编译Statement进行操作。
  • ReuseExecutor: 可重用执行器,在同一个SqlSession生命周期内重用预编译Statement,减少数据库连接资源消耗。
  • BatchExecutor: 批量执行器,支持批量提交SQL,提高了大量数据插入、更新等操作的性能。

执行过程概览

  1. SqlSession接收到用户调用后,将请求转发给其内部持有的Executor
  2. Executor根据请求类型(查询、更新等)选择合适的策略执行SQL,包括生成动态SQL(如果有)、准备Statement、设置参数及执行SQL。
  3. 执行完毕后,Executor负责将结果映射为Java对象,并返回给SqlSession

3. 源码层面的交互分析

SqlSession调用如selectOne这样的方法时,实际上是对内部Executor发起委托请求。

public <E> E selectOne(String statement, Object parameter) {List<E> list = this.executor.query(statement, parameter, RowBounds.DEFAULT, Executor.NO_RESULT_HANDLER);if (list.size() > 1) {throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());} else if (list.size() == 1) {return list.get(0);} else {return null;}
}

上述代码片段展示了SqlSession如何通过Executor执行查询请求,并对结果进行处理。在实际执行过程中,Executor还会根据配置信息和请求特性决定是否启用二级缓存、延迟加载等功能。

4. 结论与展望

通过对SqlSessionExecutor的深入解读,我们更清晰地理解了MyBatis如何高效、灵活地执行SQL并管理数据库事务。接下来的文章将进一步探讨MyBatis的动态SQL构建过程、插件扩展机制以及缓存体系,以便读者能全面掌握MyBatis的工作原理和技术细节。

这篇关于【手把手带你玩转MyBatis】深入源码解读MyBatis系列(二):SqlSession与Executor的交互机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/632895

相关文章

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解