三张图看懂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

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值