正文

MyBatis 的整体架构分为三层, 分别是基础支持层核心处理层接口层,如下图所示。

基础支持层

反射模块

该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层使调用,并且对反射操作进行了一系列优化,例如缓存了类的元数据,提高了反射操作的性能。

类型转换模块

类型转换模块提供了两个主要功能,一个功能是别名机制,MyBatis 为了简化配置文件提供了别名机制;另一个功能是实现 JDBC 类型与 Java 类型之间的转换,该功能在为 SQL 语句绑定实参以及映射查询结果集时都会涉及。

日志模块

提供详细的日志输出信息,并且能够集成多种日志框架,其日志模块的一个主要功能就是集成第三方日志框架。

资源加载模块

资源加载模块主要是对类加载器进行封装,确定类加载器的使用顺序,并提供了加载类文件以及其他资源文件的功能。

解析器模块

解析器模块主要提供两个功能,一个功能是对 XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供支持;另一个功能是为处理动态 SQL 语句中的占位符提供支持。

数据源模块

MyBatis 自身提供了相应的数据源实现,也提供了与第三方数据源集成的接口。

事务管理

MyBatis 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。一般在应用中,MyBatis 会与 Spring 框架集成,并由 Spring 框架管理事务。

缓存模块

MyBatis 中提供了一级缓存和二级缓存,而这两级缓存都是依赖于基础支持层中的缓存模块实现的。MyBatis 中自带的这两级缓存与 MyBatis  以及整个应用是运行在同一个 JVM 中的,共享同一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以当需要缓存大量数据时,优先考虑使用 Redis 、Memcache 等缓存产品。

Binding 模块

在调用 SqlSession 相应方法执行数据库操作时,需要指定映射文件中定义的 SQL 节点,如果出现拼写错误,我们只能在运行时才能发现相应的异常。为了尽早发现这种错误,MyBatis 通过 Binding 模块将用户自定义的 Mapper 接口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的SQL 语句完成数据库操作,从而避免上述问题。

需要注意的是,开发人员无须编写自定义 Mapper 接口的实现,MyBatis 会自动为其创建动态代理对象。

核心处理层

在核心处理层中实现了 MyBatis 的核心处理流程,其中包括 MyBatis 的初始化以及完成一次数据库操作涉及的全部流程。

配置解析

在 MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及 Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中。之后,利用该 Configuration 对象创建 SqlSessionFactory 对象。待 MyBatis 初始化之后,开发人员可以通过初始化得到 SqlSessionFactory 创建 SqlSession 对象并完成数据库操作。

SOL 解析与 scripting 模块

拼凑 SQL 语句是一件烦琐且易出错的过程,为了将开发人员从这项枯燥无趣的工作中解脱出来,MyBatis 实现动态 SQL 语句的功能,提供了多种动态 SQL 语句对应的节点,例如, 节点、 节点、 节点等。通过这些节点的组合使用,开发人员可以写出几乎满足所有需求的动态 SQL 语句。

MyBatis 中的 scripting 模块会根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并形成数据库可执行的 SQL 语句。之后会处理 SQL 语句中的占位符,绑定用户传入的实参。

SQL 执行

SQL 语句的执行涉及多个组件,其中比较重要的是 Executor 、StatementHandler 、ParameterHandler 和 ResultSetHandler。Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作委托给 StatementHandler 完成。StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定;然后通过 java.sql.Statement 对象执行 SQL 语句并得到结果集;最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回。

插件

用户可以通过添加自定义插件的方式对 MyBatis 进行扩展。用户自定义插件也可以改变 MyBatis 的默认行为,例如,我们可以拦截 SQL 语句并对其进行重写。由于用户自定义插件会影响 MyBatis 的核心行为,在使用自定义插件之前,开发人员需要了解 MyBatis 内部的原理,这样才能编写出安全、高效的插件。

下图展示了 MyBatis 执行一条 SQL 语句的大致过程。

接口层

接口层相对简单,其核心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API,也就是上层应用与 MyBatis 交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作。

可以通过 MyBatis 源码的目录结构查看各个模块的具体实现,目录结构如下图所示。

封装的很清晰,基本是一个模块一个 package。

最后总结我的面试经验

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。

另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。

资料领取方式:点击这里免费获取

BAT面试经验

实战系列:Spring全家桶+Redis等

其他相关的电子书:源码+调优

面试真题:

711144)]

面试真题:

[外链图片转存中…(img-R3ytJxR6-1627622711145)]

[外链图片转存中…(img-5VXftTCs-1627622711146)]

Java高级面试题!docker启动相关推荐

  1. JAVA高级面试题汇总及答案

    JAVA高级面试题汇总及答案 1.hashaMap原理源码 2.synchronize关键字1.6之后的优化,(偏向轻量级锁,重量级锁) 3.双亲委派是什么 4.类加载过程中可以动态改字节码吗? 5. ...

  2. java高级面试题收集及答案

    2021 java高级面试题收集及答案 以下问题是个人面试时收集,答案纯属个人见解,如有错误请不吝赐教,感激不尽. 这里写目录标题 2021 java高级面试题收集及答案 一级目录 二级目录 三级目录 ...

  3. 2023最新ChatGPT整理的40道Java高级面试题

    2023 年最火的就是 ChatGPT 了,很多同事使用他完成一些代码上的智能提示,也有人使用它发了财<「用ChatGPT年入百万!」各博主发布生财之道,网友:答辩搬运工>.<&qu ...

  4. 【JAVA】2022年JAVA高级面试题汇总

    一.参考资料 不容错过的Java高级面试题_帝都的雁的博客-CSDN博客_java高级面试题 java面试题汇总(上)_Oliverfly1的博客-CSDN博客_java面试题 史上最全的中高级 JA ...

  5. 2021年Java高级面试题总结

    零基础如何学习Java? 首先,你要明白一点,Java入门不难! 无论你是从事哪个行业,兴趣一定是最好的老师,也是你学习的动力. 学习方式1:自学 自学模式其实我个人不建议绝大部分的人选择,因为自学是 ...

  6. 【面试题】-java高级面试题汇总

    花大笔墨整理的一些java高级程序猿必会的面试题,其中有很多都是大厂面试题. 目录 1.spring IOC原理 2.spring bean生命周期 3.spring aop原理 4.spring m ...

  7. JAVA中的线程安全与非线程安全,java面试题,java高级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 转自 ...

  8. 12道Java高级面试题:java时间差计算

    前言 分布式,是程序员必备技能之一,在面试过程中属于必备类的,在工作中更是会经常用到.而Kafka是一个分布式的基于发布订阅的消息队列,目前它的魅力是无穷的,对于Kafka的奥秘,还需要我们细细去探寻 ...

  9. 2021年哔哩哔哩Java高级面试题及答案,讲的太透彻了

    前言 说起Spring中循环依赖的解决办法,相信很多园友们都或多或少的知道一些,但当真的要详细说明的时候,可能又没法一下将它讲清楚.本文就试着尽自己所能,对此做出一个较详细的解读.另,需注意一点,下文 ...

  10. Java高级面试题!oracle转mysql

    前言: 随着秋招的开启,不管是应届毕业生找工作,还是在职程序员跳槽去找更高薪水的工作,都要面临面试这一难关.应对面试不仅需要丰富的项目经历,还需要牢固的基础知识.在这里整理一些比较详细的Java高频面 ...

最新文章

  1. 《HTML5 canvas开发详解(第2版)》——1.9 HTML5 Canvas对象
  2. 五种计算机编程语言注定要衰落,牛逼的你怎么看呢???
  3. RabbitMQ不公平分发
  4. 服务器iis7.5 配置文件,使用注册表项 - Internet Information Services | Microsoft Docs
  5. VGA光纤收发器特点及参数
  6. Java笔记-Spring Boot中Spring WS WS-Addressing中@Action实例
  7. python 3.8.2_python-3.8.2-docs-html
  8. ASP.NET AJAX:Ajax验证(ajax+Handler处理)
  9. Tornado之异步authenticated
  10. NLP︱高级词向量表达(一)——GloVe(理论、相关测评结果、Rpython实现、相关应用)
  11. 9.深入分布式缓存:从原理到实践 --- Tair探秘
  12. 比赛计分软件部分界面抓图
  13. HDU - 1247 (字典树水题)
  14. Maya API编程快速入门
  15. 课后作业三:软件分析与用户体验分析
  16. 美国服务器电影网站版权问题,为什么说选择美国服务器做电影网站比较好
  17. 台式计算机摄像头插哪,台式电脑摄像头怎么调试
  18. 查找二叉排序树的双亲节点,并输出路径
  19. 计算机二级 公共基础知识资料
  20. 应用程序.f/q(f了个墙)

热门文章

  1. 中国碳酸锰(CAS+598-62-9)市场趋势报告、技术动态创新及市场预测
  2. php rc5,ThinkPHP 6.0 RC5 发布,多应用模式独立及中间件机制调整
  3. 怎么做app图标_App拉新:以老拉新活动怎么做?
  4. vs code无法启动怎么解决?
  5. Python菜鸟入门:day09数据结构
  6. 应用内广告帮助乐易实现收入+玩家时长双丰收
  7. 如何避免循环中“突兀”的break和continue
  8. 2021 年 Java 开发者生产力报告
  9. 抖音否认封杀腾讯;程序员拒绝带电脑回家被开除,获赔 19.4 万;Excel 具备图灵完备性 | 极客头条...
  10. 从技术到应用实践,揭秘京东区块链布局全景