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. vue原理之-神奇的Object.defineProperty

    vue2.0通过defineProperty进行数据双向绑定 例如:(他接受三个参数,都是必填!) var a= {} Object.defineProperty(a,"b",{ ...

  2. python解压可迭代对象赋值给多个变量

    如果一个可迭代对象的元素个数超过了变量的个数,会出现"解压值太多"的异常,python提供*号表达式(码夫破石的理解)来解决. 1,求一组平均值,就以类似学生成绩为例,要求是去掉第 ...

  3. Git简易教程-安装及简单使用

    Git是一种版本控制器,在项目开发中可以用来托管代码 一.下载安装Git 1. Git下载 地址:https://git-scm.com/download/win 2. 安装 检验是否安装成功 电脑桌 ...

  4. [leetcode]508. Most Frequent Subtree Sum二叉树中出现最多的值

    遍历二叉树,用map记录sum出现的次数,每一个新的节点都统计一次. 遍历完就统计map中出现最多的sum Map<Integer,Integer> map = new HashMap&l ...

  5. javaScript编写9*9口诀

    学习html+css+javaScript<!DOCTYPE html> <html> <head> <title>chaoba</title&g ...

  6. 各开源协议BSD、Apache Licence 2.0、GPL

    以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的协议.基本上使用者可以"为所欲为",可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有 ...

  7. Beta冲刺——第八天

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...

  8. kafka如何保证消息得顺序性

    1. 问题 比如说我们建了一个 topic,有三个 partition.生产者在写的时候,其实可以指定一个 key,比如说我们指定了某个订单 id 作为 key,那么这个订单相关的数据,一定会被分发到 ...

  9. CentOS 7 网卡注释

    TYPE=Ethernet # 网络类型为:EthernetPROXY_METHOD=none # 代理方式:关闭状态BROWSER_ONLY=no # 只是浏览器:否BOOTPROTO=static ...

  10. ATM_tests

    ATM取款机练习程序 一.程序分析 自顶向下.逐步细化 按照程序执行的流程,将程序分解为若干个功能相对独立的函数(方法),每个函数(方法)负责某一功能,然后根据程序执行的流程,将函数(方法)组装(调用 ...