当前位置: 首页 > news >正文

第六章 SqlSession 执行 Mapper 过程

在 MyBatis 3 中,SqlSession 执行 Mapper 的过程是一个涉及多个组件和步骤的复杂流程。这个流程主要依赖于 MyBatis 的核心组件,包括配置解析、SQL 映射器(Mapper)、动态 SQL 构建、SQL 执行以及结果映射等。下面是一个简化的过程描述,说明了 SqlSession 如何执行 Mapper 中的方法。

1. 获取 Mapper 接口的代理对象

当开发者调用 Mapper 接口中的方法时,实际上是通过 MyBatis 生成的代理对象来执行的。MyBatis 在创建 SqlSession 时会缓存 Mapper 接口的代理对象,这些代理对象在调用方法时会转发到 MyBatis 的内部机制上。

2. 解析 Mapper 接口

在 MyBatis 启动或 SqlSessionFactory 被创建时,MyBatis 会解析 Mapper 接口以及对应的 XML 映射文件(如果有的话)。这个过程中,MyBatis 会使用 Java 反射机制来查找 Mapper 接口中的方法,并将它们与 XML 映射文件中的 SQL 语句(或注解中的 SQL 语句)关联起来。

3. 构建 BoundSql

当 SqlSession 接收到 Mapper 方法的调用时,MyBatis 会根据方法名和参数类型查找之前解析的 Mapper 映射信息。然后,MyBatis 会构建 BoundSql 对象,这个对象包含了最终要执行的 SQL 语句、参数信息以及相关的映射信息。

  • 如果 Mapper 方法使用了 MyBatis 的注解(如 @Select@Insert 等),MyBatis 会直接解析这些注解来构建 SQL 语句。
  • 如果 Mapper 方法没有使用注解,而是依赖于 XML 映射文件,MyBatis 会根据 Mapper 接口中的方法名和 XML 文件中的 <select><insert> 等标签的 id 属性来匹配并构建 SQL 语句。

4. 参数替换和动态 SQL

在构建 BoundSql 的过程中,MyBatis 会处理 SQL 语句中的参数替换。如果 SQL 语句是动态的(即包含了条件判断、循环等),MyBatis 会使用动态 SQL 构建器来根据传入的参数值动态地构建最终的 SQL 语句。

5. 执行 SQL 语句

构建好 BoundSql 后,MyBatis 会使用 JDBC 连接来执行 SQL 语句。这个过程包括打开数据库连接(如果尚未打开)、设置 SQL 语句参数、执行 SQL 语句,并处理任何生成的 JDBC 结果集。

6. 结果映射

执行 SQL 语句后,MyBatis 会将 JDBC 结果集映射为 Java 对象。这个过程依赖于 Mapper 映射文件中定义的 <resultMap> 元素或方法注解中的结果映射信息。MyBatis 会根据这些信息将结果集中的列映射到 Java 对象的属性上。

7. 返回结果

最后,MyBatis 将映射后的 Java 对象返回给调用者。这个对象可能是单个实体、实体列表、Map 或其他类型,具体取决于 Mapper 方法的返回类型和 SQL 语句的查询结果。

需要注意的是,上述过程是一个简化的描述,MyBatis 的实际实现可能会更复杂,并且涉及到更多的细节和组件。此外,MyBatis 还提供了丰富的功能和插件扩展点,允许开发者根据需要自定义和扩展 MyBatis 的行为。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 学习Power BI第一步先从安装开始(一)
  • springboot系列--自动配置原理
  • QT 联合opencv 易错点
  • 自动驾驶相关的理论基础
  • C语言-数据结构 无向图迪杰斯特拉算法(Dijkstra)邻接矩阵存储
  • vscode 使用git bash,路径分隔符缺少问题
  • 苍穹外卖学习笔记(三)
  • 深度学习驱动下的字符识别:挑战与创新
  • Vue Router 入门指南:基础配置、路由守卫与动态路由
  • 关于武汉芯景科技有限公司的IIC缓冲器芯片XJ4307开发指南(兼容LTC4307)
  • LabVIEW软件,如何检测连接到的设备?
  • 3.记:Android EditText接收扫码枪输入数据丢失问题
  • 828华为云征文|华为云Flexus X实例docker部署MinIO对象存储系统obs
  • 【机器人工具箱Robotics Toolbox开发笔记(一)】Matlab机器人工具箱简介
  • 如何在Word中插入复选框
  • [deviceone开发]-do_Webview的基本示例
  • [nginx文档翻译系列] 控制nginx
  • 2017 年终总结 —— 在路上
  • Apache Spark Streaming 使用实例
  • git 常用命令
  • java第三方包学习之lombok
  • Java教程_软件开发基础
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mysql innodb 索引使用指南
  • Odoo domain写法及运用
  • - 概述 - 《设计模式(极简c++版)》
  • 聚簇索引和非聚簇索引
  • 类orAPI - 收藏集 - 掘金
  • 聊聊flink的BlobWriter
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何在 Tornado 中实现 Middleware
  • 微信小程序设置上一页数据
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • mysql面试题分组并合并列
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ![CDATA[ ]] 是什么东东
  • # 数论-逆元
  • #if等命令的学习
  • #Linux(帮助手册)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (四)库存超卖案例实战——优化redis分布式锁
  • (自用)网络编程
  • .NET : 在VS2008中计算代码度量值
  • .NET Framework .NET Core与 .NET 的区别
  • .Net MVC + EF搭建学生管理系统
  • .NET MVC第三章、三种传值方式
  • .NET未来路在何方?
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法