【手把手带你玩转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

相关文章

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

mybatis直接执行完整sql及踩坑解决

《mybatis直接执行完整sql及踩坑解决》MyBatis可通过select标签执行动态SQL,DQL用ListLinkedHashMap接收结果,DML用int处理,注意防御SQL注入,优先使用#... 目录myBATiFBNZQs直接执行完整sql及踩坑select语句采用count、insert、u

MySQL之搜索引擎使用解读

《MySQL之搜索引擎使用解读》MySQL存储引擎是数据存储和管理的核心组件,不同引擎(如InnoDB、MyISAM)采用不同机制,InnoDB支持事务与行锁,适合高并发场景;MyISAM不支持事务,... 目录mysql的存储引擎是什么MySQL存储引擎的功能MySQL的存储引擎的分类查看存储引擎1.命令

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe