MyBatis StatementHandler 是如何与数据库进行交互的?

StatementHandler 在 MyBatis 中扮演着 连接 MyBatis 框架和 JDBC API 的桥梁 的角色。 它的核心作用是 处理 JDBC Statement 对象,并负责 MyBatis 与数据库的实际交互StatementHandler 封装了所有与 JDBC Statement 对象相关的操作,使得 MyBatis 的其他组件 (例如 Executor) 无需直接操作 JDBC API,而是通过 StatementHandler 提供的接口与数据库进行交互。

StatementHandler 与数据库交互的核心步骤和机制:

  1. StatementHandler 的创建:

    • StatementHandler 实例由 Executor 创建。 Executor 会根据 MappedStatement 对象中定义的 statementType 属性 (例如 STATEMENT, PREPARED, CALLABLE),创建不同类型的 StatementHandler 实现类实例 (例如 SimpleStatementHandler, PreparedStatementHandler, CallableStatementHandler)。
    • StatementHandler 的创建通常发生在 Executor.query()Executor.update() 等 SQL 执行方法内部,在真正执行 SQL 语句之前。
  2. StatementHandler.prepare() 方法:准备 JDBC Statement 对象

    • StatementHandlerprepare(Connection connection, Integer transactionTimeout) 方法负责 创建 JDBC Statement 对象
    • 根据 MappedStatementstatementType 属性,创建不同类型的 Statement 对象:
      • statementType="STATEMENT": 创建 java.sql.Statement 对象 (普通 Statement)。 适用于不需要预编译 SQL 或参数绑定的简单 SQL 语句。
      • statementType="PREPARED" (默认): 创建 java.sql.PreparedStatement 对象 (预编译 Statement)。 适用于大多数场景,可以提高性能和安全性,支持参数绑定。
      • statementType="CALLABLE": 创建 java.sql.CallableStatement 对象 (可调用 Statement)。 适用于调用数据库存储过程或函数。
    • 使用传入的 Connection 对象创建 Statement Connection 对象通常由 Transaction 对象提供,代表当前事务的数据库连接。
    • 设置 Statement 的超时时间 (transactionTimeout)。 如果 transactionTimeout 不为 null,会调用 statement.setQueryTimeout(transactionTimeout) 设置 Statement 的超时时间,防止 SQL 执行时间过长。
    • 返回创建好的 JDBC Statement 对象。
  3. StatementHandler.parameterize() 方法:设置 SQL 参数

    • StatementHandlerparameterize(Statement statement) 方法负责 为 JDBC Statement 对象设置 SQL 参数
    • 根据 MappedStatement 中定义的参数映射 (ParameterMapping),从传入的参数对象 (parameterObject) 中获取参数值。 参数映射信息包括参数的属性名、jdbcType、typeHandler 等。
    • 使用 TypeHandler 将 Java 参数值转换为 JDBC 类型的值,并通过 JDBC StatementsetXXX() 方法 (例如 PreparedStatement.setString(), PreparedStatement.setInt(), CallableStatement.registerOutParameter() 等) 将参数值设置到 Statement 对象中。
    • 不同类型的 StatementHandler 实现类,会采用不同的参数设置方式:
      • PreparedStatementHandler: 使用 PreparedStatement.setXXX() 方法设置参数 (最常用)。
      • CallableStatementHandler: 使用 CallableStatement.setXXX() 设置输入参数,使用 CallableStatement.registerOutParameter() 注册输出参数。
      • SimpleStatementHandler: 对于 Statement 对象,参数通常直接拼接在 SQL 语句中 (不安全,不推荐)。 在 MyBatis 中,SimpleStatementHandler 实际上并不直接处理参数设置 (参数设置通常交给 ParameterHandler 完成,ParameterHandler 再委托给 TypeHandler 进行类型转换和参数设置)。
  4. StatementHandler.query() 方法:执行 SQL 查询并处理 ResultSet

    • StatementHandlerquery(Statement statement, ResultHandler resultHandler) 方法负责 执行 SQL 查询语句,并处理查询结果集 (ResultSet)
    • 调用 JDBC Statement.execute()Statement.executeQuery() 方法执行 SQL 查询语句,获取 ResultSet 对象。 具体调用哪个方法取决于 MappedStatement 的 SQL 类型 (SELECT 调用 executeQuery(), 其他调用 execute())。
    • 使用 ResultHandler 对象逐行处理 ResultSet ResultHandler 负责遍历 ResultSet,并根据 ResultMapresultType 定义的映射规则,将每一行数据映射到 Java 对象。
    • 返回查询结果列表 (List)。 ResultHandler 会将映射后的 Java 对象添加到结果列表中,query() 方法最终返回这个结果列表。
    • 在处理 ResultSet 过程中,StatementHandler 会委托给 ResultSetHandler 组件进行更具体的结果集处理和映射操作。
  5. StatementHandler.update() 方法:执行 SQL 更新语句

    • StatementHandlerupdate(Statement statement) 方法负责 执行 SQL 更新语句 (INSERT, UPDATE, DELETE)。
    • 调用 JDBC Statement.execute()Statement.executeUpdate() 方法执行 SQL 更新语句。 具体调用哪个方法取决于 MappedStatement 的 SQL 类型 (INSERT, UPDATE, DELETE 通常调用 executeUpdate(), 某些特殊情况可能调用 execute()).
    • 返回受影响的行数 (int)。 update() 方法返回执行 SQL 更新语句后,数据库受影响的行数。
  6. StatementHandler.batch() 方法:执行批量 SQL 语句 (BatchExecutor 使用)

    • StatementHandlerbatch(Statement statement) 方法负责 执行批量 SQL 语句 (BatchExecutor 使用)
    • 将多条 SQL 语句添加到 JDBC Statement 对象的批处理队列中 (例如 PreparedStatement.addBatch()).
    • 在所有 SQL 语句添加到批处理队列后,调用 Statement.executeBatch() 方法一次性执行批处理队列中的所有 SQL 语句。
    • 返回一个 List<BatchResult>, 包含了每条 SQL 语句的执行结果 (受影响的行数或异常信息)。

StatementHandler 接口的主要方法:

  • StatementHandler(Executor executor, MappedStatement mappedStatement, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) (构造器): 创建 StatementHandler 实例。
  • Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException;: 准备 JDBC Statement 对象。
  • void parameterize(Statement statement) throws SQLException;: 为 JDBC Statement 对象设置 SQL 参数。
  • <E> List<E> query(Statement statement, ResultHandler resultHandler) throws SQLException;: 执行 SQL 查询语句,并处理结果集。
  • int update(Statement statement) throws SQLException;: 执行 SQL 更新语句 (INSERT, UPDATE, DELETE)。
  • void batch(Statement statement) throws SQLException;: 执行批量 SQL 语句 (BatchExecutor 使用)。

StatementHandler 的实现类:

MyBatis 提供了以下几种 StatementHandler 接口的实现类,对应不同的 JDBC Statement 类型:

  • SimpleStatementHandler: 处理 java.sql.Statement 对象 (普通 Statement)。 最简单的 StatementHandler 实现。
  • PreparedStatementHandler: 处理 java.sql.PreparedStatement 对象 (预编译 Statement)。 最常用的 StatementHandler 实现。
  • CallableStatementHandler: 处理 java.sql.CallableStatement 对象 (可调用 Statement)。 用于调用数据库存储过程或函数。
  • RoutingStatementHandler: 路由 StatementHandler。 根据 MappedStatementstatementType 属性,动态地选择使用 SimpleStatementHandler, PreparedStatementHandler, 或 CallableStatementHandler 中的一个。 RoutingStatementHandler 本身不直接处理 Statement,而是作为其他 StatementHandler 的路由和委托。

总结 StatementHandler 与数据库的交互:

  • StatementHandler 是 MyBatis 与数据库交互的桥梁,负责处理 JDBC Statement 对象。
  • StatementHandler 通过 prepare(), parameterize(), query(), update(), batch() 等方法,完成 JDBC Statement 对象的创建、参数设置、SQL 执行和结果处理等操作。
  • StatementHandler 内部使用 JDBC API (例如 Connection, Statement, ResultSet) 与数据库进行交互。
  • StatementHandler 抽象了底层的 JDBC 操作细节,为 MyBatis 的其他组件提供了更高层次的、更易于使用的 SQL 执行接口。
  • MyBatis 提供了多种 StatementHandler 实现类,对应不同的 JDBC Statement 类型,满足不同的 SQL 执行需求.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/37382.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白闯AI:Llama模型Lora中文微调实战

文章目录 0、缘起一、如何对大模型进行微调二、模型微调实战0、准备环境1、准备数据2、模型微调第一步、获取基础的预训练模型第二步:预处理数据集第三步:进行模型微调第四步:将微调后的模型保存到本地4、模型验证5、Ollama集成部署6、结果测试三、使用总结AI是什么?他应该…

Linux基础开发工具——gdb/cgdb(7)

文章目录 前言一、生成可调试文件二、调试打开与关闭启动调试l 查看代码退出调试运行与断点单行与单步 三、查看变量bt 查看调用堆栈p 临时查看变量display 常显示变量 四、快速跳转until 指定行finish 函数c 断点 五、其他指令disable 断点使能set var 设置条件ptype 查看变量…

Python 3.13.2安装教程(安装包)Python 3.13.2 快速安装指南

文章目录 前言一 、Python 3.13.2下载二、Python 3.13.2安装教程1.运行安装程序2.选择安装方式3.自定义安装选项4.开始安装5.安装完成6.打开程序7.验证安装 前言 Python 作为一门通用编程语言&#xff0c;在全球拥有庞大的用户群体。其简洁易读的语法和丰富的库&#xff0c;使…

游戏MOD伴随盗号风险,仿冒网站借“风灵月影”窃密【火绒企业版V2.0】

游戏MOD&#xff08;即游戏修改器&#xff09;是一种能够对游戏进行修改或增强的程序&#xff0c;因其能够提升游戏体验&#xff0c;在玩家群体中拥有一定的市场。然而&#xff0c;这类程序大多由第三方开发者制作&#xff0c;容易缺乏完善的安全保障机制&#xff0c;这就为不法…

【读点论文】Chain Replication for Supporting High Throughput and Availability

在分布式系统中&#xff0c;强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库&#xff0c;其保证了强一致性&#xff0c;但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库&#xff0c;虽然其吞吐量、和扩展性很高&#xff0c;但往往只支持最终一致性&#xff0c;无…

新书速览|云原生Kubernetes自动化运维实践

《云原生Kubernetes自动化运维实践》 本书内容&#xff1a; 《云原生Kubernetes自动化运维实践》以一名大型企业集群运维工程师的实战经验为基础&#xff0c;全面系统地阐述Kubernetes&#xff08;K8s&#xff09;在自动化运维领域的技术应用。《云原生Kubernetes自动化运维实践…

Linux驱动学习笔记(六)

平台总线 1.平台总线模型也叫platform总线模型&#xff0c;平台总线是Linux系统虚拟出来的总线, 引入总线的概念可以对驱动代码和设备信息进行分离。平台总线模型将一个驱动分成了两个部分&#xff1a;platform_device和platform_driver&#xff0c;例如可使用文件device.c和d…

高频GNSS同震形变计算方法

高频GNSS&#xff08;通常采样率为 1Hz-50Hz&#xff09;可以提供高时间分辨率的地震形变信息&#xff0c;计算同震形变&#xff08;coseismic displacement&#xff09;的方法主要包括 趋势线法 和 基线法。

从简单探测到业务模拟:IT监控如何突破传统监控边界

探测是一种用于主动检测和评估IT系统、网络设备、应用服务等目标对象运行状态和性能指标的技术手段。它通过模拟用户操作、发送测试信号或执行特定的检查任务&#xff0c;实时获取目标对象的响应情况和相关数据&#xff0c;从而帮助运维人员及时发现潜在问题、评估系统健康状况…

卡特兰数在数据结构上面的运用

原理 Catalan数是一个数列&#xff0c;其第n项表示n个不同结点可以构成的二叉排序树的数量。Catalan数的第n项公式为&#xff1a; &#xfffc; 其中&#xff0c;&#xfffc;是组合数&#xff0c;表示从2n个元素中选择n个元素的组合数。 Catalan数的原理可以通过以下方式理解&…

CCBCISCN复盘

AWDP – ccfrum 自己搭了一下环境, 复现一下这道题目, 之前比赛的时候完全没想到这个漏洞要怎么打, 修也不知道要怎么修, 就仅仅是对用户名的账号和密码进行了一下过滤, 完全没起到作用, 唉, 实在太菜 如果想要尝试复现的话可以尝试拉取这个镜像, 我打完之后就直接把这个容器给…

【sgAutocomplete_v2】自定义组件:基于elementUI的el-input组件开发的搜索输入框(支持本地保存历史搜索关键词、后台获取匹配项)

特性&#xff1a; 支持本地记录搜索关键词后台接口匹配搜索关键词支持自定义填充字段名支持user或address两种匹配列表布局样式 sgAutocomplete_v2 <template><div :class"$options.name" mouseover"inside true" mouseout"inside false…

算法模型从入门到起飞系列——背包问题(探索最大价值的掘金之旅)

文章目录 前言一、背包问题溯源&#xff08;动态规划&#xff09;1.1 动态规划的概念1.2 动态规划的基本步骤1.3 动态规划的实际应用 二、背包问题2.1 背包问题衍生2.2 0-1背包2.2.1 0-1背包描述2.2.2 0-1背包图解2.2.3 0-1背包代码刨析 2.3 完全背包2.3.1 完全背包描述2.3.2 完…

数据库原理及应用mysql版陈业斌实验一

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验一&#xff1a;数据库与数据表的定义和数据操作 1.实验数据如下 …

腾讯云创建DeepSeek AI应用及使用教程

文章目录 腾讯云大模型知识引擎创建 DeepSeek 应用文档一、前期准备二、创建应用1. 进入应用管理界面2. 应用配置3. 发布应用 三、管理应用四、测试应用五、API接入应用API接入文档详细链接HTTP 对话端接口文档WebSocket对话端接口文档 六、常见问题七、注意事项 腾讯云大模型知…

关于FastAPI框架的面试题及答案解析

FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…

Linux上位机开发实战(camera视频读取)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 关于linux camera&#xff0c;一般都是认为是mipi camera&#xff0c;或者是usb camera。当然不管是哪一种&#xff0c;底层的逻辑都是v4l2&#x…

【强化学习】Reward Model(奖励模型)详细介绍

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

计算机组成原理和计算机网络常见单位分类及换算

计算机组成原理&#xff08;主要用于存储、内存、缓存等&#xff09; 计算机网络&#xff08;主要用于传输速率&#xff09; 直观对比

Elasticsearch零基础入门:从安装到入门

目录 一、Elasticsearch简介 二、环境快速搭建 1. 单节点本地部署&#xff08;Docker版&#xff09; 2. 验证安装 三、核心概念图解 与传统数据库对比 架构概念说明 四、REST API基础操作 1. 索引管理 2. 文档CRUD操作 五、基础搜索实战 1. 全文搜索 2. 精确匹配 …