引言

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

MyBatis 底层工作原理的更多相关文章

  1. PHP底层工作原理

    最近搭建服务器,突然感觉lamp之间到底是怎么工作的,或者是怎么联系起来?平时只是写程序,重来没有思考过他们之间的工作原理: PHP底层工作原理 图1 php结构 从图上可以看出,php从下到上是一个 ...

  2. Java面试必问之线程池的创建使用、线程池的核心参数、线程池的底层工作原理

    一.前言 大家在面试过程中,必不可少的问题是线程池,小编也是在面试中被问啥傻了,JUC就了解的不多.加上做系统时,很少遇到,自己也是一知半解,最近看了尚硅谷阳哥的课,恍然大悟,特写此文章记录一下!如果 ...

  3. Mybatis之工作原理

    1.Mybatis的架构 1.1 Mybatis的框架分层 1.2 MyBatis的实现原理 mybatis底层还是采用原生jdbc来对数据库进行操作的,它支持定制化 SQL.存储过程以及高级映射的优 ...

  4. Hibernate和Mybatis的工作原理以及区别

    一.Mybatis的工作流程图 (1).原理详见: MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一 ...

  5. 每天用Mybatis,但是Mybatis的工作原理你真的知道吗?

    近来想写一个mybatis的分页插件,但是在写插件之前肯定要了解一下mybatis具体的工作原理吧,于是边参考别人的博客,边看源码就开干了. 核心部件: SqlSession Executor Sta ...

  6. MyBatis底层实现原理: 动态代理的运用

    转载:https://mp.weixin.qq.com/s/_6nyhaWX15mh3mkj8Lb0Zw Mybatis中声明一个interface接口,没有编写任何实现类,Mybatis就能返回接口 ...

  7. mybatis的工作原理

    MyBatis的框架架构 看到Mybatis的框架图,可以清晰的看到Mybatis的整体核心对象,我更喜欢用自己的图来表达Mybatis的整个的执行流程.如下图所示: 原理详解: MyBatis应用程 ...

  8. spring的自动装配,骚话@Autowired的底层工作原理

    前言 开心一刻 十年前,我:我交女票了,比我大两岁.妈:不行!赶紧分! 八年前,我:我交女票了,比我小两岁,外地的.妈:你就不能让我省点心? 五年前,我:我交女票了,市长的女儿.妈:别人还能看上你?分 ...

  9. for循环 底层工作原理

    for 循环是对容器进行迭代的过程. 什么是迭代? 迭代就是从某个容器对象中逐个地读取元素,直到容器中没有更多元素为止. for 循环的步骤是什么? 先判断对象是否为可迭代对象,不是的话直接报错,抛出 ...

  10. MyBatis基本工作原理

    Application是程序员开发的Java代码,蓝色为MyBatis框架. API是MyBatis提供的增删改查等功能接口. 老式SQL写法我们在Dao中写SQL: SELECT * FROM us ...

随机推荐

  1. MySQL 04 深入浅出索引(上)

    索引的常见模型 实现索引的方式有很多种,这里先介绍三种常见结构:哈希表.有序数组和搜索树. 哈希表:只适用于只有等值查询的场景. 有序数组:在等值查询和范围查询场景中的性能都非常优秀,但是在更新数据的 ...

  2. c# 判断程序是否Debug模式还是Release模式 调试模式,开发模式,发布模式

    https://blog.csdn.net/qq_37664403/article/details/118747195 1.Debug模式,Release模式#if DEBUGConsole.Writ ...

  3. RestFul 标准Api

    RestFul Api 规范(URL,HTTP,版本,状态码,返回值,请求条件等规范) get (select) :从服务器取出资源(一项或多项) post (Create) :在服务器新建一个资源 ...

  4. Hadoop:HDFS设计原理

    一.HDFS组成结构 1.NameNode 相当于Master,主要存储文件的元数据(文件名.目录结构.文件属性等),以及每个文件的块列表和块所在的DataNode. 配置副本策略,管理数据库映射信息 ...

  5. leetcode 1406

    简介 国服第一的刷题视频 参考链接 https://www.bilibili.com/video/BV1W54y197NM?from=search&seid=16875469481128889 ...

  6. ItemTouchHelper拖动结束取得目标索引位置

    重写 clearView 要想取得目标索引位置,需要找到拖动结束,松开鼠标后的调用方法 //拖动完成之后调用,所操作的viewHolder即为目标位置的项目 @Override public void ...

  7. ETLCloud中如何执行SQL脚本

    SQL脚本 在数据库管理与数据分析的广阔领域中,SQL(Structured Query Language,结构化查询语言)脚本扮演着举足轻重的角色.作为一门专为关系型数据库设计的编程语言,SQL不仅 ...

  8. ETL简介:数据集成与应用

    导言: 在当今大数据时代,组织和企业需要处理和分析庞大的数据量.ETL(Extract, Transform, Load)是一种重要的数据集成和处理方法,它在数据管理和决策支持中起着关键作用.本文将介 ...

  9. SciTech-Python-编译Python的C/C++扩展的setup.py使用pybind映射C/C++到Python库

    pybind:pybind11 - Seamless operability between C++11 and Python header-only library exposes C++ type ...

  10. SciTech-EE-Mobile-OTG: 切换Host与Device角色由手机USB接口取电为外部设备供电的方法

    SciTech-EE-Mobile-OTG: 由手机USB接口取电为外部设备供电的方法 OTG接口与转换器 OTG是"On The Go"的英文缩写,字面上可以理解为"安 ...