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. 前端Firebug常见错误:SyntaxError:missing variable nam

    出现上面那个问题应该是 某个地方,分号写错了 检查一下是否由于应该写分号的地方写成了其他符号.

  2. C#中的深度学习(一):使用OpenCV识别硬币

    在本系列文章中,我们将使用深度神经网络(DNN)来执行硬币识别.具体来说,我们将训练一个DNN识别图像中的硬币. 在本文中,我们将描述一个OpenCV应用程序,它将检测图像中的硬币.硬币检测是硬币完整 ...

  3. 小白数据分析——Python职位全链路分析

    最近在做Python职位分析的项目,做这件事的背景是因为接触Python这么久,还没有对Python职位有一个全貌的了解.所以想通过本次分析了解Python相关的职位有哪些.在不同城市的需求量有何差异 ...

  4. H3C路由器配置——动态路由RIP协议

    一.静态路由的不足 静态路由适用于:小规模的网络.架构不怎么调整的网络.没有环路的网络 二.RIP协议工作过程 2.1.工作特点 n路由信息协议RIP(Routing Information Prot ...

  5. matplotlib学习日记(十)-共享绘图区域的坐标轴

    (1)共享单一绘图区域的坐标轴 ''' 上一讲介绍了画布的划分,有时候想将多张图放在同一个绘图区域, 不想在每个绘图区域只绘制一幅图形,这时候借助共享坐标轴的方法实现在一个绘图区 绘制多幅图形的目的. ...

  6. Abp小试牛刀之 图片上传

    图片上传是很常见的功能,里面有些固定的操作也可以沉淀下来. 本文记录使用Abp vNext做图片上传的姿势. 本文的技术核心与Abp无关,Abp只是手段! 目标 上传图片----->预览图片-- ...

  7. 二进制格式mysql

    1.二进制MySQL安装 #下载二进制格式的mysql软件包 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.31- ...

  8. 二本非科班,秋招,实习,面试,offer之路

    不知不觉已经工作一年多的,我是2019年7月毕业的,但是如果算上实习就工作差不多两年了的吧. 最近不是刚刚过了圣诞节吗?然后又准备到元旦了,迎来2021年!在微信公众号上看到小部分公众号在总结2020 ...

  9. mysql8.0.x中datasource信息

    driverClassName: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql:// ...

  10. FAAS -- Serverless

    FAAS概念,无服务器运算,功能即服务,function-as-a-service 初创企业-大型企业.民间组织-政府机构 ===>>>> 上云 云计算第三代技术 -- Ser ...