前言:一直以来,很多人都是拿来主义,只停留在会使用的阶段,从未去研究挖掘其原理,剖析本质。现在慢慢探讨一下其内幕,抛砖引玉

一、简介

1)常用的持久化框架

  • Hibernate:是一款Java世界中最著名的ORM框架之一
  • JPA(Java Persistence API): 是EJB 3 .0中持久化部分的规范,但它可以脱离EJB的体系单

    独作为一个持久化规范进行使用
  • Spring JDBC:严格来说,Sring JDBC不能算是一个ORM架,它仅仅是使用模板方式对原生DBC行了一层非常薄的封装
  • MyBatis: MyBatis前身是Apache基金会的开源项目iBatis,在2010 年该项目脱离Apache基金会并正式更名为MyBatis

2)使用步骤

  • 传统的JDBC编程中的查询操作为例进行说明,其主要步骤如下:

      1. 注册数据库驱动类 ,明确指定数据库URL地址、数据库用户名、密码等连接信息
      1. 通过DriverManager打开数据库连接
      1. 通过数据库连接创建Statement对象
      1. 通过 Statement 对象执行 SQL 语句,得到 ResultSet 对象
      1. 通过 ResultSet 读取数据,并将数据转换成 JavaBean 对象
      1. 关闭 ResultSetStatement 对象以及数据库连接,释放相关资源

    java操作数据库

  • 使用MyBatis,其主要步骤如下:
      1. 配置mybatis-config.xml配置文件, 配置数据库的URL地址、数据库用户名和密码、别名信息、映射配置文件的位置以及一些全局配置信息
      1. 应用程序首先会加载mybatis-config.xml配置文件
      1. 井根据配置文件的内容创建 SqlSessionFactory 对象
      1. 通过 SqlSessionFactory 对象创建 SqlSession 对象, SqlSession 接口中定义了执行SQL语句所需要的各种方法
      1. 通过 SqlSession 对象执行映射配置文件中定义的 SQL 语句,完成相应的数据操作
      1. 通过 SqlSession 对象提交事务,关闭 SqlSession 对象

3)Mybatis整体架构

  • 整体结构图

  • 一条sql大致的执行过程

① 基础支持层
  • 反射模块

    • 反射工具箱:在进行参数处理、结果映射等操作时,会涉及大量的反射操作,Java中的反射虽然功能强大,但是代码编写起来比较复杂且容易出错,为了简化反射操作的相关代码,MyBatis提供了专门的反射模块,该模块位于 org.apache.ibatis.reflection 包中,它对常见的反射操作做了进一步封装,提供了更加简洁方便的反射API
  • 类型转换模块

    • 功能

        1. 别名机制
        1. 转换机制:在为 SQL 语句绑定实参时, 会将数据由 Java 类型转换成 JDBC 类型;而在映射结果集时,会将数据由 JDBC 类型转换成 Java 类型
  • 日志模块:

    • 功能

        1. 提供详细的日志输出信息
        1. 集成第三方日志框架
  • 资源加载模块

    • 功能

        1. 对类加载器进行封装,确定类加载器的使用顺序
        1. 提供了加载类文件以及其他资源文件的功能
  • 解析器模块

      • 功能

          1. XPath 进行封装,为 MyBatis 初始化时解析 mybatis-config.xml 配置文件以及映射配置文件提供支持
          1. 为处理动态 SQL 语句中的占位符提供支持
  • 数据源模块:提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中

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

  • 缓存模块

    • 功能
      1. 提供一级缓存和二级缓存
    • 简单的缓存使用图



      注意: MyBatis 中自带的这两级缓存与 MyBatis 以及整个应用是运行在同一个JVM中的,共享同一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以当需要缓存大量数据时 ,优先考虑使用 RedisMemcache 等缓存产品
  • Binding模块:MyBatis 通过 Binding 模块将用户自定义的 Mapper 接口与映射配置文件关联起来,系统可以通过调用自定义 Mapper 接口中的方法执行相应的 SQL 语句完成数据库操作,开发人员无须编写自定义 Mapper 接口的实现, MyBatis 会自动为其创建动态代理对象

② 核心处理层
  • 配置解析

    • MyBatis 初始化过程中,会加载 mybatis-config.xml 配置文件、映射配置文件以及Mapper 接口中的注解信息,解析后的配置信息会形成相应的对象并保存到 Configuration 对象中
  • SOL 解析与 scripting 模块
    • 为了将开发人员从这项枯燥无趣的工作中解脱出来, MyBatis 实现动态 SQL 语句的功能,提供了多种动态 SQL 语句对应的节点
    • scripting 模块会根据用户传入的实参,解析映射文件中定义的动态 SQL 节点,并形成数据库可执行的 SQL 语句 。之后会处理 SQL 语句中的占位符,绑定用户传入的实参
  • SOL 执行:语句的执行涉及多个组件 ,其中比较重要的是ExecutorStatementHandlerParameterHandlerResulSetHandler,步骤如下:
      1. Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作 ,它会将数据库相关操作委托给 StatementHandler 完成
      1. StatementHandler 首先通过 ParameterHandler 完成 SQL 语句的实参绑定,然后通过java.sql.Statement 对象执行 SQL 语句并得到结果集
      1. 最后通过 ResultSetHandler 完成结果集的映射,得到结果对象并返回
  • 插件:可以通过添加用户自定义插件的方式对 MyBatis 进行扩展,用户自定义插件也可以改变 Mybatis 的默认行为
③ 接口层
  • 接口层相对简单,其核心是 SqlSession 接口,该接口中定义了 MyBatis 暴露给应用程序调用的 API,也就是上层应用与 MyBatis 交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作

总结

  • 本篇简单介绍了 MyBatis 整体架构及各层之间的功能。若要用好并深入,请关注下一篇原理剖析篇

[一天一个进阶系列] - MyBatis基础篇的更多相关文章

  1. 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)

    背景 ​ 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...

  2. 【webpack 系列】基础篇

    Webpack 基础篇 基本概念 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器.当 webpack 处理应用程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每 ...

  3. SQL系列总结——基础篇(三)

    之前的两篇文章SQL系列总结:<基础篇一>, <基础篇二>已经介绍了一些基本的数据库知识.现在让我们来从头开始构建一个数据库.到管理数据库和对象. 架构开始!     1.创建 ...

  4. SQL系列总结——基础篇(一)

       数据库与表.列的关系其实就像是一个Excel工作薄(workbook)与Excel表格(sheet)以及表格中的列的关系一样.关系数据库中最基本的对象有3个:表.列.用户     基本的概念名词 ...

  5. Android自定义控件系列之基础篇

    一.概述 在android开发中很多UI控件往往需要进行定制以满足应用的需要或达到更加的效果,接下来就通过一个系列来介绍自定义控件,这里更多是通过一些案例逐步去学习,本系列有一些典型的应用,掌握好了大 ...

  6. docker进阶之路-基础篇 | 一:环境搭建

    转载请注明作者及出处: 作者:银河架构师 原文链接:https://www.cnblogs.com/luas/p/12061747.html 一.准备工作 查看内核 Docker 要求 CentOS ...

  7. docker进阶之路-基础篇 | 二:portainer安装与基本使用

    转载请注明作者及出处: 作者:银河架构师 原文链接:https://www.cnblogs.com/luas/p/12061755.html ​简介 Portainer 是轻量级,跨平台,开源的管理D ...

  8. 深入理解javascript函数进阶系列第三篇——函数节流和函数防抖

    前面的话 javascript中的函数大多数情况下都是由用户主动调用触发的,除非是函数本身的实现不合理,否则一般不会遇到跟性能相关的问题.但在一些少数情况下,函数的触发不是由用户直接控制的.在这些场景 ...

  9. [AngularJS] AngularJS系列(1) 基础篇

    目录 什么是AngularJS? 为什么使用/ng特性 Hello World 内置指令 内置过滤器 模块化开发 一年前开始使用AngularJS(以后简称ng),如今ng已经出2了.虽说2已完全变样 ...

随机推荐

  1. 如何解决Renesas USB3.0RootHub警告

    打开WINDOWS系统的[计算机管理]-[服务和应用程序]-[服务]-点击[Portable Device Enumerator Service]服务,设置为启动类型:自动(延迟启动).并点击&quo ...

  2. nginx二级域名配置[CentOS]

    目录 背景 域名配置 服务器配置 Nginx配置 页面访问生效 背景 只有一台云服务器,部署了自己写的后端管理系统,又需要部署下自己的个人博客平台,但是只有一个域名,想要合理的利用下二级域名. 域名配 ...

  3. light-rtc: 理念与实践

    在与同行交流过程中,发现很多同行对 WebRTC 改动太多,导致无法升级 WebRTC 版本.而 WebRTC 开源社区的快速迭代,让他们感到欣喜又焦虑:开源社区的迭代效果,是不是超过了他们对 Web ...

  4. 一次mongo查询不存在字段引发的事故

    话说今天的一个小小的查询失误给了我比较深刻的教训,也让我对mongo有了更深刻的理解,下面我们来说说这个事情的原委: 我们经常使用阿里云子账号在DMS上查询线上数据库数据,今天也是平常的一次操作 集合 ...

  5. Synchronized 精讲

    1.简介 1.1 作用 在并发场景中,保证同一时刻只有一个线程对有并发隐患的代码进行操作 1.2 错误案例 需求:两个线程对 count 变量进行200000次循环增加,预期结果是400000次 pu ...

  6. Docker-ce Centos8 笔记一:安装Docker-ce

    Docker是一个建设企业及数据中心服务仓库的进程,通过裸金属机和虚拟机承载的MAC.windows和linux系统提供本地和远程软件服务,涉及应用软件镜像.系统镜像.虚拟化仓库(虚拟机).它承载着灵 ...

  7. 【Java基础】集合

    集合 集合概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储.另一方面,使用 Array 存储对象方面具有一些弊端,而 Java 集合就像一种容器 ...

  8. 解决Cannot find module '@angular/compiler-cli'

    前言: 今天clone之前做的一个angular项目,使用ng serve一直提示An unhandled exception occurred: Cannot find module '@angul ...

  9. Docker学习笔记之进入容器Bash

    我们在创建容器的时候,如果容器的命令(command)不是/bin/bash的时候,使用docker attach命令是会卡住进不去容器的bash shell的.如下图所示: 所以,这里记录一个可以进 ...

  10. Head First 设计模式 —— 15. 与设计模式相处

    模式 是在某情境(context)下,针对某问题的某种解决方案. P579 情景:应用某个模式的情况 问题:你想在某情境下达到的目标,但也可以是某情境下的约束 解决方案:一个通用的设计,用来解决约束. ...