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. Java篇:Docker的介绍安装 和常用命令

    文章目录 为什么 出现docker Docker的简介 容器(Container) 镜像(Image) 仓库(Repository) Docker的安装 查看容器 删除镜像 删除容器 部署应用 以my ...

  2. Python进阶学习_连接操作Redis数据库

    安装导入第三方模块Redis pip3 install redis import redis 操作String类型 """ redis 基本命令 String set(n ...

  3. HCIP -- OSPF 总结

    OSPF:Open Shortest path First  :开方式最短路径优先 一.基础知识: 1.使用范围:IGP 2.协议算法特点:链路状态型路由协议,SPF算法 3.协议是否传递网络掩码:是 ...

  4. CentOS8更换国内YUM源

    rm -rf /etc/yum.repos.d/* wget -O /etc/yum.repos.d/CentOS-cnnic.repo https://feieryun.oss-cn-zhangji ...

  5. [从源码学设计]蚂蚁金服SOFARegistry之Data节点变更

    [从源码学设计]蚂蚁金服SOFARegistry之Data节点变更 目录 [从源码学设计]蚂蚁金服SOFARegistry之Data节点变更 0x00 摘要 0x02 引子 0x03 业务范畴 3.1 ...

  6. 麦格理银行借助DataStax Enterprise (DSE) 驱动数字化转型

    在本文中,我们将介绍DataStax Enterprise是如何助力澳大利亚最大的投资银行麦格理银行的数字银行,实现了实时分析和自然语言搜索等多项功能,并为用户提供了个性化的用户体验. "D ...

  7. Qt学习笔记-设计简易的截图工具软件

    现在利用Qt来实现一个截图软件. 首先,设计一个界面出来. 最上面有一个label用来显示图片. 然后使用QPixmap中的静态函数grabWindow来获取图片.这里需要一个winID.可以使用 Q ...

  8. MySQL为Null会导致5个问题,个个致命!

    在正式开始之前,我们先来看下 MySQL 服务器的配置和版本号信息,如下图所示: "兵马未动粮草先行",看完了相关的配置之后,我们先来创建一张测试表和一些测试数据. -- 如果存在 ...

  9. java图像开发学习——JTable之导入数据库

    package demo; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.MouseAd ...

  10. WebSocket协议 与 IO多路复用

    最近在把 Facebook Message 接入客服系统,由于与 Facebook Message 对接的收发消息都是通过调用 http 接口来实现的,如果想实现即时通讯,还需要在中间加一个 WebS ...