正文

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。

结局:总结+分享

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了Java互联网工程师面试1000题,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱,所以福利也为你准备,这份1000题免费送你!点击这里免费领取

  • Java互联网工程师面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

  • 程序员代码面试指南–IT名企算法与数据结构题目最优解

  • 其余像设计模式,建议可以看看下面这4份PDF(已经整理)

  • 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

[外链图片转存中…(img-ncBxFCrn-1627017549932)]

以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!

Java进阶之光!mysql创建用户并授权建表相关推荐

  1. centos 7 mysql 创建用户_【CentOS 7MySQL常用操作4】,MySQL创建用户以及授权#180116

    hellopasswd MySQL创建用户以及授权 grant all on . to 'user1' identified by 'passwd'; grant SELECT,UPDATE,INSE ...

  2. python 全栈开发,Day63(子查询,MySQl创建用户和授权,可视化工具Navicat的使用,pymysql模块的使用)...

    昨日内容回顾 外键的变种三种关系:多对一:左表的多 对右表一 成立左边的一 对右表多 不成立foreign key(从表的id) refreences 主表的(id)多对多建立第三张表(foreign ...

  3. centos的mysql怎么删用户_linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤...

    linux/centos给Mysql创建用户.授权.查看.删除.修改密码.撤 linux/centos给Mysql创建用户.授权.查看.删除.修改密码.撤销权限 linux/centos给Mysql创 ...

  4. 【数据库】Mysql 创建用户与授权

    Mysql 创建用户与授权 1. 创建用户: CREATE USER 'username'@'host' [IDENTIFIED BY 'password']; username:要创建的用户名: h ...

  5. MySQL创建用户并授权

    MySQL创建用户并授权 创建用户 使用 命令创建 #使用 CREATECREATE USER 'testDatabase'@'%' IDENTIFIED BY '111111'; # CREATE ...

  6. MySQL创建用户与授权方法

    一, 创建用户: 命令:CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说 明:username - 你将创建的用户名, host - ...

  7. mysql 创建用户并授权_教你MySQL-8.0.x数据库授权

    Mysql安装成功后,默认的root用户密码为空,你可以使用以下命令来创建root用户的密码: [root@host]# mysqladmin -u root password "new_p ...

  8. mysql 创建用户、授权、修改密码

    以下操作都要在mysql所在机器操作 一.创建用户 CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; 或 insert into mysql. ...

  9. MySQL创建用户并授权、删除用户(密码规则)

    文章目录 创建用户 密码 查看密码规则 修改密码规则 修改密码 授权 为已有用户授权远程连接 授权 刷新系统权限表 删除用户 创建用户 create user '用户名'@'%' identified ...

最新文章

  1. 百度云加速 ajax,使用百度云加速后网站打开速度慢、广告不显示的解决方法
  2. 去除桌面图标蓝底的方法步骤
  3. 第一章:1.1.4信号运算
  4. pythonmsgbox怎么使用_如何使用tkinter的messagebox
  5. Orleans入门例子
  6. 怎么批量修改html文件后缀,怎么批量修改文件后缀
  7. pdf不支持64位浏览器_4MLinux 31.0 发布,不支持32位
  8. rtt面向对象oopc——2.对象容器理解和rtt类的联系
  9. Windows和Mac os x一样不安全?!
  10. WEB前端常用JavaScript代码整理(二)
  11. VirtualBox虚拟机硬盘容量扩容
  12. MSIL实用指南-一维数组的操作
  13. 基于KDJ指标的Dual Thrust策略
  14. linux使用163的yum源配置
  15. linux时间戳转时间
  16. Safari插件机制研究(二) 插件的视图管理
  17. scrapy 爬取腾讯招聘网
  18. 一个“精神病”人的世界观——我看完了,然后陷入深深的不安中……
  19. Java — 内部类存在意义
  20. 何涛连忙叫请兄弟到 常用软件

热门文章

  1. spring对事务的控制 AOP
  2. An Algorithm Summary of Programming Collective Intelligence (1)
  3. python 线型_CCF 202006-1 线性分类器 python
  4. 人工通道会取消吗_二七政策将用于ETC?高速或将取消人工收费通道
  5. python字典与json转换_python字典与json转换的方法总结
  6. matlab把符号数,Matlab 符号与数值之间的转换
  7. plsql连接mysql_安装了mysql和pl/sql,怎么配置让pl/sql能联接mysql数据库
  8. OJ RuntimeError常见原因
  9. Windows使用筛选器来处理异常
  10. node oauth2验证_如何设置和使用护照OAuth Facebook身份验证(第2部分)| Node.js