三张图看懂MyBatis运行原理(面试重点)

三张图看懂MyBatis运行原理

MyBatis运行原理

image.png

image.png

image.pn

总结

StatementHandler接口有如下类,作用分别是:

  1. SimpleStatementHandler

    • 这个实现类处理的是非预编译的SQL语句,直接使用JDBC的Statement对象执行SQL。
    • 由于不支持参数化查询,因此在安全性上存在SQL注入的风险,所以在现代编程实践中较少推荐直接使用这种方式执行SQL。
  2. PreparedStatementHandler

    • 此实现类处理的是预编译的SQL语句,对应JDBC的PreparedStatement接口。
    • 通过预编译SQL语句并在运行时绑定参数,PreparedStatement能够有效地防止SQL注入攻击,同时还能利用数据库引擎对预编译SQL的优化。
  3. CallableStatementHandler

    • 此实现类用于处理存储过程调用,对应JDBC的CallableStatement接口。
    • 它可以执行带有IN/OUT/INOUT参数的存储过程,并能获取存储过程的返回值以及输出参数。
  4. RoutingStatementHandler

    • 这个接口并非直接执行SQL,而是作为上述三个StatementHandler的路由控制器,根据传入的MappedStatement的信息决定应该使用哪种具体的StatementHandler来处理请求。
    • 它是MyBatis内部的一种策略模式或工厂模式的应用,根据需求动态地选择合适的StatementHandler实例来执行相应的数据库操作。这种设计增加了MyBatis的灵活性和可扩展性。

Executor执行接口有如下类,作用分别是:

  1. SimpleExecutor

    • 这是MyBatis中最简单的Executor实现,每当执行一个SQL语句时,它都会创建一个新的java.sql.Statement对象。
    • 这意味着每次执行都会重新准备和执行SQL,适用于不涉及大量重复SQL且对性能要求不高的场景。
  2. ReuseExecutor

    • ReuseExecutor试图提高性能,特别是对于同一SQL多次执行的情况。它会复用已经存在的PreparedStatement对象,而不是每次都创建新的。
    • 这样可以减少数据库连接资源的消耗,尤其在并发环境下,对于相同SQL的连续执行效率有所提升。
  3. BatchExecutor

    • BatchExecutor专门用于执行批量操作,它会对多次执行的相同SQL语句进行批处理(batching),一次性提交到数据库,大幅减少了网络传输开销和数据库服务器的压力。
    • 这对于插入、更新大量数据时效率尤为显著。
  4. CachingExecutor

    • CachingExecutor是一种装饰器模式(Decorator Pattern)的实现,它包装了其他的Executor(如SimpleExecutor、ReuseExecutor),并且添加了二级缓存的支持。
    • 在执行查询操作时,首先检查缓存中是否有符合条件的数据,如果有则直接从缓存返回结果,否则才执行实际的数据库查询并将结果放入缓存,以便后续查询复用。

此外,还有一个重要概念:

  • BaseExecutor
    • BaseExecutor是一个抽象类,它实现了Executor接口的大部分方法,提供了对一级缓存的支持以及其他通用逻辑,如事务管理等。
    • 各类Executor实现如SimpleExecutor、ReuseExecutor和CachingExecutor均继承自BaseExecutor,并在其基础上增加特定的功能。

默认情况下,MyBatis配置中如果没有特别指定Executor类型,则可能会使用CachingExecutor,配合合理的二级缓存配置,以提高查询性能。
但请注意,MyBatis的一级缓存是默认开启的,它存在于BaseExecutor中,而二级缓存需要额外配置才能启用。

原文链接 https://www.hanyuanhun.cn | https://node.hanyuanhun.cn

posted @   汉源魂  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示