Mybatis源码分析——StatementHandler

在 MyBatis 中,StatementHandler 是负责处理 SQL 语句执行过程的核心组件之一。它的主要职责是:根据传入的 SQL 语句、参数、分页信息等,准备和执行 SQL 语句。StatementHandler 通常与 Executor 配合工作,Executor 负责执行 SQL 操作,而 StatementHandler 则负责为 SQL 操作准备好所需的 SQL 语句和参数。

StatementHandler 接口概述

StatementHandler 是一个接口,提供了多种方法来支持 MyBatis 执行不同类型的 SQL 语句(如查询、更新、批量操作等)。通过不同的实现类,StatementHandler 可以根据 SQL 类型的不同(例如查询或更新)来处理 SQL 语句的准备工作。

主要方法:
  1. prepare(Connection connection, Integer transactionTimeout)

    • 负责创建一个 Statement(如 PreparedStatementStatement),并根据提供的数据库连接和事务超时配置进行准备。此方法会为 SQL 语句分配相应的资源。
  2. parameterize(PreparedStatement ps)

    • 设置 SQL 语句的参数。该方法将 SQL 语句和 mapper 方法中传入的参数进行绑定。这一步是将查询或更新语句的参数传递到 PreparedStatement 中,确保参数正确无误。
  3. query(Statement statement)

    • 执行查询操作。如果是查询操作,StatementHandler 会处理查询结果集 (ResultSet) 并将其映射到 Java 对象中。
  4. batch(Statement statement)

    • 用于批量执行 SQL 语句。在批量插入、更新或删除时,StatementHandler 会将多个 SQL 操作合并为一个批量操作,减少数据库交互的次数,从而提高效率。
  5. update(Statement statement)

    • 执行更新操作(如 INSERTUPDATEDELETE)。StatementHandler 负责执行更新操作并返回影响的记录数。

StatementHandler 的主要实现类

MyBatis 提供了几种不同的 StatementHandler 实现,以应对不同的使用场景和 SQL 类型。

1. SimpleStatementHandler

SimpleStatementHandler 是 MyBatis 默认的 StatementHandler 实现。它适用于 SQL 语句简单、不涉及动态 SQL 的场景。它每次执行时都会创建一个新的 Statement,没有缓存机制。

  • 特点
    • 简单、直接,但效率较低。
    • 每次执行 SQL 时都会创建一个新的 Statement
2. PreparedStatementHandler

PreparedStatementHandler 是 MyBatis 中常用的 StatementHandler 实现,它为 SQL 语句提供了参数绑定的能力。它会使用 PreparedStatement 来执行 SQL 查询或更新操作。

  • 特点
    • 支持参数绑定,提高了 SQL 执行效率。
    • 能够有效防止 SQL 注入问题。
    • 通常用于执行带有参数的查询或更新操作。
3. CallableStatementHandler

CallableStatementHandler 负责处理存储过程(存储过程调用)。它通常用于执行数据库的存储过程操作,和 PreparedStatementHandler 类似,但用于存储过程的调用。

StatementHandler 在 MyBatis 中的作用和流程

StatementHandler 在 MyBatis 中的主要作用是准备、绑定参数并执行 SQL 语句。它与 ExecutorResultSetHandler 等其他组件密切配合,共同完成数据库操作。整个执行过程可以分为以下几个步骤:

1. 创建 StatementHandler
  • StatementHandler 是通过 Executor 来创建的,Executor 会根据实际需要选择不同的 StatementHandler 实现类(如 SimpleStatementHandlerPreparedStatementHandler)来处理 SQL 操作。
2. 准备 SQL 语句
  • StatementHandler 会根据传入的 SQL 语句和参数,准备一个 Statement(通常是 PreparedStatement),并为其绑定参数。具体来说:
    • 如果是查询操作,它会根据查询条件和 RowBounds(用于分页)创建合适的 PreparedStatement
    • 如果是更新操作,它会绑定 SQL 更新语句的参数。
3. 设置参数
  • StatementHandler 会调用 parameterize 方法来为 PreparedStatement 设置参数。该方法将 mapper 方法中传入的参数值绑定到 SQL 语句中,以确保 SQL 语句能够正确执行。
4. 执行 SQL 语句
  • StatementHandler 会执行 SQL 语句,如果是查询操作,它会处理返回的 ResultSet,并将其映射为对应的 Java 对象;如果是更新操作,它会执行 UPDATEINSERTDELETE 操作,并返回受影响的行数。
5. 处理事务
  • StatementHandlerExecutor 配合,确保在事务中执行 SQL 语句时,能够正确提交或回滚事务。

代码示例:StatementHandler 的使用流程

下面是一个简单的 StatementHandler 执行查询的过程示例:

 

public class StatementHandlerExample {
    public static void main(String[] args) {
        // 获取 SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = ...;

        try (SqlSession session = sqlSessionFactory.openSession()) {
            // 获取 Executor
            Executor executor = session.getExecutor();
            // 获取 MapperStatement(包含 SQL 语句信息)
            MapperStatement ms = ...;

            // 获取 StatementHandler
            StatementHandler statementHandler = executor.createStatementHandler(ms, null);

            // 准备 SQL 语句并绑定参数
            Connection connection = session.getConnection();
            PreparedStatement ps = (PreparedStatement) statementHandler.prepare(connection, 100);
            statementHandler.parameterize(ps);

            // 执行查询并处理结果
            ResultSet rs = statementHandler.query(ps);
            while (rs.next()) {
                // 处理结果集
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

StatementHandler 与缓存和插件

MyBatis 通过缓存机制和插件机制进一步优化了 StatementHandler 的执行过程:

  1. 一级缓存:在同一个 SqlSession 中,如果执行相同的查询 SQL,MyBatis 会缓存查询结果,避免多次执行相同的 SQL 语句。
  2. 二级缓存:在整个 MyBatis 会话中共享缓存,可以跨 SqlSession 存储查询结果。
  3. 插件机制:你可以通过自定义 MyBatis 插件来拦截和增强 StatementHandler 的执行流程,比如记录日志、性能监控、参数加密等。

总结

  • StatementHandler 在 MyBatis 中负责准备和执行 SQL 语句,它是 MyBatis 中核心组件之一。
  • 它有多个实现,如 SimpleStatementHandlerPreparedStatementHandlerCallableStatementHandler,每个实现适用于不同类型的 SQL 操作。
  • StatementHandler 主要负责设置 SQL 参数、执行 SQL 语句、处理查询结果或更新结果,并与事务管理密切配合。
  • 它通常与 ExecutorResultSetHandler 配合使用,形成 MyBatis 中的核心执行流程。

理解 StatementHandler 的工作原理,有助于深入了解 MyBatis 是如何处理 SQL 执行、参数绑定和结果映射的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值