三张图看懂MyBatis运行原理(面试重点)
三张图看懂MyBatis运行原理
MyBatis运行原理
总结
StatementHandler
接口有如下类,作用分别是:
-
SimpleStatementHandler:
- 这个实现类处理的是非预编译的SQL语句,直接使用JDBC的
Statement
对象执行SQL。 - 由于不支持参数化查询,因此在安全性上存在SQL注入的风险,所以在现代编程实践中较少推荐直接使用这种方式执行SQL。
- 这个实现类处理的是非预编译的SQL语句,直接使用JDBC的
-
PreparedStatementHandler:
- 此实现类处理的是预编译的SQL语句,对应JDBC的
PreparedStatement
接口。 - 通过预编译SQL语句并在运行时绑定参数,PreparedStatement能够有效地防止SQL注入攻击,同时还能利用数据库引擎对预编译SQL的优化。
- 此实现类处理的是预编译的SQL语句,对应JDBC的
-
CallableStatementHandler:
- 此实现类用于处理存储过程调用,对应JDBC的
CallableStatement
接口。 - 它可以执行带有IN/OUT/INOUT参数的存储过程,并能获取存储过程的返回值以及输出参数。
- 此实现类用于处理存储过程调用,对应JDBC的
-
RoutingStatementHandler:
- 这个接口并非直接执行SQL,而是作为上述三个StatementHandler的路由控制器,根据传入的MappedStatement的信息决定应该使用哪种具体的StatementHandler来处理请求。
- 它是MyBatis内部的一种策略模式或工厂模式的应用,根据需求动态地选择合适的StatementHandler实例来执行相应的数据库操作。这种设计增加了MyBatis的灵活性和可扩展性。
Executor
执行接口有如下类,作用分别是:
-
SimpleExecutor:
- 这是MyBatis中最简单的Executor实现,每当执行一个SQL语句时,它都会创建一个新的
java.sql.Statement
对象。 - 这意味着每次执行都会重新准备和执行SQL,适用于不涉及大量重复SQL且对性能要求不高的场景。
- 这是MyBatis中最简单的Executor实现,每当执行一个SQL语句时,它都会创建一个新的
-
ReuseExecutor:
- ReuseExecutor试图提高性能,特别是对于同一SQL多次执行的情况。它会复用已经存在的
PreparedStatement
对象,而不是每次都创建新的。 - 这样可以减少数据库连接资源的消耗,尤其在并发环境下,对于相同SQL的连续执行效率有所提升。
- ReuseExecutor试图提高性能,特别是对于同一SQL多次执行的情况。它会复用已经存在的
-
BatchExecutor:
- BatchExecutor专门用于执行批量操作,它会对多次执行的相同SQL语句进行批处理(batching),一次性提交到数据库,大幅减少了网络传输开销和数据库服务器的压力。
- 这对于插入、更新大量数据时效率尤为显著。
-
CachingExecutor:
- CachingExecutor是一种装饰器模式(Decorator Pattern)的实现,它包装了其他的Executor(如SimpleExecutor、ReuseExecutor),并且添加了二级缓存的支持。
- 在执行查询操作时,首先检查缓存中是否有符合条件的数据,如果有则直接从缓存返回结果,否则才执行实际的数据库查询并将结果放入缓存,以便后续查询复用。
此外,还有一个重要概念:
- BaseExecutor:
- BaseExecutor是一个抽象类,它实现了Executor接口的大部分方法,提供了对一级缓存的支持以及其他通用逻辑,如事务管理等。
- 各类Executor实现如SimpleExecutor、ReuseExecutor和CachingExecutor均继承自BaseExecutor,并在其基础上增加特定的功能。
默认情况下,MyBatis配置中如果没有特别指定Executor类型,则可能会使用CachingExecutor,配合合理的二级缓存配置,以提高查询性能。
但请注意,MyBatis的一级缓存是默认开启的,它存在于BaseExecutor中,而二级缓存需要额外配置才能启用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!