MyBatis 底层工作原理

引言

SqlSession 是 MyBatis 提供的面向用户的操作数据库 API。那么 MyBatis 底层是如何工作的呢?为了解开MyBatis的神秘面纱,我们需要了解一下MyBatis的其他几个比较核心的组件及这些组件的作用。

MyBatis 核心组件

MyBatis的执行流程及核心组件如图:

  • Configuration:用于描述MyBatis的主配置信息,其他组件需要获取配置信息时,直接通过Configuration对象获取。除此之外,MyBatis在应用启动时,将Mapper配置信息、类型别名、TypeHandler等注册到Configuration组件中,其他组件需要这些信息时,也可以从Configuration对象中获取。
  • MappedStatement:MappedStatement用于描述Mapper中的SQL配置信息,是对Mapper XML配置文件中<select|update|delete|insert>等标签或者@Select/@Update等注解配置信息的封装。
  • SqlSession:SqlSession是MyBatis提供的面向用户的API,表示和数据库交互时的会话对象,用于完成数据库的增删改查功能。SqlSession是Executor组件的外观,目的是对外提供易于理解和使用的数据库操作接口。
  • Executor:Executor是MyBatis的SQL执行器,MyBatis中对数据库所有的增删改查操作都是由Executor组件完成的。
  • StatementHandler:StatementHandler封装了对JDBC Statement对象的操作,比如为Statement对象设置参数,调用Statement接口提供的方法与数据库交互,等等。
  • ParameterHandler:当MyBatis框架使用的Statement类型为CallableStatement和PreparedStatement时,ParameterHandler用于为Statement对象参数占位符设置值。
  • ResultSetHandler:ResultSetHandler封装了对JDBC中的ResultSet对象操作,当执行SQL类型为SELECT语句时,ResultSetHandler用于将查询结果转换成Java对象。
  • TypeHandler:TypeHandler是MyBatis中的类型处理器,用于处理Java类型与JDBC类型之间的映射。它的作用主要体现在能够根据Java类型调用PreparedStatement或CallableStatement对象对应的setXXX()方法为Statement对象设置值,而且能够根据Java类型调用ResultSet对象对应的getXXX()获取SQL执行结果。

MyBatis 执行流程

了解了MyBatis的核心组件后,我们再来了解一下使用MyBatis操作数据库的过程。

  1. 在 MyBatis 框架的基本使用时,我们使用到了 SqlSession 组件,它是用户层面的 API。
  2. 实际上 SqlSession 是 Executor 组件的外观,目的是为用户提供更友好的数据库操作接口,这是设计模式中外观模式(或门面模式)的典型应用。
  3. 真正执行 SQL 操作的是 Executor 组件,Executor 可以理解为 SQL 执行器,它会使用 StatementHandler 组件对 JDBC 的 Statement 对象进行操作。
  4. 当 Statement 类型为 CallableStatement 和 PreparedStatement 时,会通过 ParameterHandler 组件为参数占位符赋值。
  5. ParameterHandler 组件中会根据 Java 类型找到对应的TypeHandler 对象,TypeHandler 中会通过 Statement 对象提供的 setXXX() 方法(例如setString()方法)为 Statement 对象中的参数占位符设置值。
  6. StatementHandler 组件使用 JDBC 中的 Statement 对象与数据库完成交互后,当 SQL 语句类型为 SELECT 时,MyBatis 通过 ResultSetHandler 组件从 Statement 对象中获取 ResultSet 对象,然后将 ResultSet 对象转换为 Java 对象。

参考文章链接:https://blog.csdn.net/qq_35946969/article/details/122987664

posted @   Binge-和时间做朋友  阅读(130)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示