StatementHandler 是 MyBatis 中对接 JDBC 的核心组件,根据 SQL 类型由 RoutingStatementHandler 路由创建 PreparedStatementHandler、SimpleStatementHandler 或 CallableStatementHandler;通过 ParameterHandler 和 TypeHandler 绑定参数;按操作类型(query/update/batch/queryCursor)执行 SQL 并返回结果;生命周期由 Executor 管理,每次执行新建实例,支持插件拦截定制。

MyBatis 中的 StatementHandler 是 SQL 执行链路里真正对接 JDBC 的关键组件,它不直接写 SQL,而是把 MyBatis 解析好的 SQL、参数、执行要求,翻译成 JDBC 能理解的动作。
StatementHandler 怎么创建 Statement 对象
它根据 SQL 类型和配置,决定用哪种 JDBC Statement:
-
PreparedStatementHandler:默认使用,对应
PreparedStatement,支持预编译、参数占位符(?)、防 SQL 注入;适合带参数的增删改查 -
SimpleStatementHandler:对应
Statement,SQL 是纯字符串拼接,无参数绑定;仅用于静态 SQL(如SELECT 1),生产环境极少用 -
CallableStatementHandler:对应
CallableStatement,专用于调用数据库存储过程,处理 IN/OUT 参数
实际创建由 RoutingStatementHandler 统一调度——它读取 MappedStatement.getStatementType(),自动选上述三者之一作为 delegate,本身不实现逻辑,只做路由。
StatementHandler 怎么绑定参数
参数绑定不是简单地把 Java 值塞进 setString(1, "xxx"),而是一套协作流程:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用
parameterize(Statement)方法,内部委托给 ParameterHandler - ParameterHandler 根据
BoundSql.parameterMappings遍历每个参数映射项 - 对每个参数,先用 TypeHandler 将 Java 类型转为 JDBC 类型(比如
LocalDateTime → Timestamp),再调用PreparedStatement.setXXX() - 动态 SQL(如
<if>、<foreach>)已在上层生成完整BoundSql.sql,此时只处理最终确定的占位符顺序与值
StatementHandler 怎么执行 SQL 并处理结果
执行阶段严格区分操作类型,各方法职责清晰:
-
update(Statement):统一处理 INSERT/UPDATE/DELETE,返回影响行数 -
query(Statement, ResultHandler):执行 SELECT,把ResultSet交给 ResultSetHandler 映射为 Java 对象(如 List<User>) -
batch(Statement):用于批处理,将多条语句 addBatch() 后统一 executeBatch() -
queryCursor(Statement):流式查询,避免大结果集全量加载到内存
注意:StatementHandler 本身不负责事务提交或缓存写入——事务由 Executor 控制,一级缓存也由 Executor 在 query 前后维护;它只管“把这一条 SQL 安全、准确地交出去,并拿回原始结果”。
StatementHandler 的生命周期由 Executor 驱动
它不是单例,每次 SQL 执行都会新建一个实例:
- Executor 调用
configuration.newStatementHandler(...)构造 - 接着调用
handler.prepare(conn, timeout)获取 Statement - 再调用
handler.parameterize(stmt)绑定参数 - 最后调用
handler.query/update(stmt, ...)执行
整个过程封装在 Executor 的模板方法中,开发者通常无需直接操作 StatementHandler,但定制插件(如分页、SQL 日志、参数脱敏)常通过拦截其 prepare 或 parameterize 方法实现。

















