mybatis是一个非常优秀的开源orm框架,在大型的互联网公司,基本上都会用到,而像程序员的圣地—阿里虽然用的是自己开发的一套框架,但其核心思想也无外乎这些,因此,去一些大型互联网公司面试的时候,总是会问到对于这些开源框架的理解,有没有阅读开源框架的源码,虽说是面试造火箭,工作拧螺丝,但是让你造火箭的时候,你总得能伸把手啊。所以,我们既然不能改变大厂,那只能自己去提升源码阅读的能力了。

mybatis其实做的事情很简单,就是封装了对数据库的访问,我们开发的时候,只需要写接口,传参,配置数据库地址,便可以轻松做到对数据库的操作。有的人觉得,这不就是写sql,jdbc访问数据库并操作吗,我自己写几个类就能实现,为什么要用这么一个玩意去做呢。其实我们确实可以按上述所说,做到一样的效果,如果说,单线程下,这样操作反而更快,但是,在用户量越来越多,开发人员越来越多,需要改动的业务越来越多,那么,mybatis作为一个优秀的orm框架,就非常有用了。

首先,如果我们自己去写jdbc代码,那么每次我们开发都要重写,最重要的是,连接资源的释放等一系列问题,我们不能保证每个开发人员都能写的一手好代码,并且,mybatis的数据源模块封装了一个简单的线程池的复用及回收的实现,可以显著的提高当用户激增所带来的高效性能的问题,既能自动新增回收线程,而且开发人员省心省力,关注业务需求及其可能出现的问题即可,数据库,就交给我吧。

其次,mybatis对重复查询数据使用了缓存,毕竟,在正常的业务需求中,都是读远大于写的,如果我们可以将重复查询的数据缓存到内存中,相信大家都知道缓存查询的速度及开销相对于去怼数据库差别有多大,根据我们的业务需求,配合使用不同的缓存淘汰策略,可以极大的节省数据库资源,毕竟数据库的性能,也就那样。

还有一点就是代码的解耦,相信每一个java程序员在刚接触到这一行的时候,就会听到解耦这两个字,但是刚开始学那会,根本不知道啥意思,解耦?能吃吗?随着工作中不断的碰到问题,写的时候暴躁的心情无处发泄,当冷静下来的时候,慢慢体会到解耦对我们是多么重要。mybatis将数据库访问和sql解析,参数解析封装起来,我们只需要告诉他什么sql,传什么参数,那么他会帮我去查,查完给我,我玩玩手机就把想要的东西拿到了,而不是我自己去做,专人做专事,既简单,效率又高,以后维护起来也方便,我想改别人的代码,看看sql,看看传参,改改就好了,就像去图书馆借书,如果没有图书管理员分门别类,把不同的类型的书放到不同区域,一本本找,多费劲。

按上面那么看,mybatis应该做了很多事情,功能很多,按道理我们写代码的时候,不是很麻烦吗,但是我们在实际写的时候,为什么并没有感觉到呢,这就是mybatis为什么能成为最受欢迎的orm框架。大家都知道mybatis是面向接口编程的,它在内部实现的时候大体分为接口层,核心处理层,基础支撑层,如下图:

可以看到我们的操作都是对SqlSession接口的访问,具体的操作由sqlSession去指派,我们不需要知道内部实现,只需要敲SqlSession这个门就可以了,这里很完美的使用了门面模式(关于设计模式,以后会写一个模块介绍常用的,从自己的角度去分析帮助大家去理解),与业务解耦,确实很优雅,核心处理层封装了整个访问的流程,从配置文件的读取,解析,参数映射到sql,结果集映射到实体类,执行sql以及插件的封装,而基础支撑层是对每一个功能的具体实现,其实在刚开始接触的时候,我想过我心目中他是咋实现的,想到了接口对外,想到了核心处理层的功能拆解,但是基础支撑层的功能拆分确实是没想到的,不仅没想到各个功能的独立拆分,甚至没想到核心处理层所实现的和基础支撑层是独立的,处理层不提供具体功能实现,只是做流程的穿插,把基础功能穿插使用。

其实mybatis的架构从一张图可以看出大概了,我们理解其实就是sql通过jdbc访问数据库并返回参数,而mybatis中却分成这么多独立的功能,而且每个功能的实现都相当复杂,看似是很恶心,很繁杂,其实看了里面的实现却又很优雅,为什么要这么设计现在确实是搞不懂,反正他牛逼,那就肯定有道理,咱一个个分析看看为啥他这么牛逼。

mybatis源码解析之架构理解的更多相关文章

  1. 【MyBatis源码解析】MyBatis一二级缓存

    MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...

  2. mybatis源码-解析配置文件(三)之配置文件Configuration解析

    目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...

  3. Mybatis源码解析,一步一步从浅入深(六):映射代理类的获取

    在文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们提到了两个问题: 1,为什么在以前的代码流程中从来没有addMapper,而这里却有getMapper? 2,UserDao ...

  4. Mybatis源码解析(一) —— mybatis与Spring是如何整合的?

    Mybatis源码解析(一) -- mybatis与Spring是如何整合的?   从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...

  5. Mybatis源码解析(二) —— 加载 Configuration

    Mybatis源码解析(二) -- 加载 Configuration    正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...

  6. MyBatis 源码篇-整体架构

    MyBatis 的整体架构分为三层, 分别是基础支持层.核心处理层和接口层,如下图所示. 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层 ...

  7. Mybatis源码解析-DynamicSqlSource和RawSqlSource的区别

    XMLLanguageDriver是ibatis的默认解析sql节点帮助类,其中的方法其会调用生成DynamicSqlSource和RawSqlSource这两个帮助类,本文将对此作下简单的简析 应用 ...

  8. mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)

    目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多 ...

  9. mybatis源码-解析配置文件(四)之配置文件Mapper解析

    在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的 ...

随机推荐

  1. DRF终极封装ViewSet和Router附教程PDF源码

    在DRF官方教程的学习过程中,一个很明显的感受是框架在不断地进行封装,我们自己写框架/工具/脚本/平台也可以模仿模仿,先完成底层代码,再做多层封装,让使用者很容易就上手操作.本文是教程的最后一篇,介绍 ...

  2. SpringBoot进阶教程(六十八)Sentinel实现限流降级

    前面两篇文章nginx限流配置和SpringBoot进阶教程(六十七)RateLimiter限流,我们介绍了如何使用nginx和RateLimiter限流,这篇文章介绍另外一种限流方式---Senti ...

  3. 生成对抗网络(Generative Adversarial Networks, GAN)

      生成对抗网络(Generative Adversarial Networks, GAN)是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的学习方法之一.   GAN 主要包括了两个部分,即 ...

  4. 利用 Watermill 实现 Golang CQRS

    CQRS CQRS 的意思是"命令-查询责任隔离".我们分离了命令(写请求)和查询(读请求)之间的责任.写请求和读请求由不同的对象处理. 就是这样.我们可以进一步分割数据存储,使用 ...

  5. [leetcode]82. Remove Duplicates from Sorted List

    第一题:遍历链表,遇到重复节点就连接到下一个. public ListNode deleteDuplicates(ListNode head) { if (head==null||head.next= ...

  6. editmd输出到前端显示

    官方案例:html-preview-markdown-to-html.html 输出后台数据显示在前端,格式化内容<!DOCTYPE html> <html lang="z ...

  7. docker学习之路(安装、使用)

    一.docker安装 1.更新现有的yum包 yum update 2.配置docker yum源 [root@docker ~]# cat /etc/yum.repos.d/docker.repo ...

  8. 一、linux安装mysql

    一.下载mysql免编译包: wget http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.33-linux-glibc2.5-x86_64.tar.g ...

  9. Flink SQL 核心概念剖析与编程案例实战

    本次,我们从 0 开始逐步剖析 Flink SQL 的来龙去脉以及核心概念,并附带完整的示例程序,希望对大家有帮助! 本文大纲 一.快速体验 Flink SQL 为了快速搭建环境体验 Flink SQ ...

  10. 总结(2019CSP之后),含题解

    从\(\mathcal{CSP}\) 爆炸 到现在,已经有\(3\)个月了.这三个月间,我--这个小蒟蒻又接触了许多听不懂的东西 \(\mathcal{No.}1\) 字符串\(\mathcal{ha ...