mybatis源码解析之架构理解
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源码解析之架构理解的更多相关文章
- 【MyBatis源码解析】MyBatis一二级缓存
MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...
- mybatis源码-解析配置文件(三)之配置文件Configuration解析
目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...
- Mybatis源码解析,一步一步从浅入深(六):映射代理类的获取
在文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们提到了两个问题: 1,为什么在以前的代码流程中从来没有addMapper,而这里却有getMapper? 2,UserDao ...
- Mybatis源码解析(一) —— mybatis与Spring是如何整合的?
Mybatis源码解析(一) -- mybatis与Spring是如何整合的? 从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...
- Mybatis源码解析(二) —— 加载 Configuration
Mybatis源码解析(二) -- 加载 Configuration 正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...
- MyBatis 源码篇-整体架构
MyBatis 的整体架构分为三层, 分别是基础支持层.核心处理层和接口层,如下图所示. 基础支持层 反射模块 该模块对 Java 原生的反射进行了良好的封装,提供了更加简洁易用的 API ,方便上层 ...
- Mybatis源码解析-DynamicSqlSource和RawSqlSource的区别
XMLLanguageDriver是ibatis的默认解析sql节点帮助类,其中的方法其会调用生成DynamicSqlSource和RawSqlSource这两个帮助类,本文将对此作下简单的简析 应用 ...
- mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)
目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多 ...
- mybatis源码-解析配置文件(四)之配置文件Mapper解析
在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的 ...
随机推荐
- Linux系统搭建RabbitMQ
下载erlang和rabbitmq-server 1.下载Erlang安装包 [root@VM_0_9_centos soft]# wget http://erlang.org/download/ot ...
- Github标星26k+!一个神奇的软件!1分钟即可打造了一个科幻风格的终端
Github掘金计划项目分类汇总(原创不易,若有帮助,欢迎分享/点赞): 编程基础 :精选编程基础如学习路线.编程语言相关的开源项目. 计算机基础:精选计算机基础(操作系统.计算机网络.算法.数据结构 ...
- NET 5 使用RabbitMQ以及Kafka区别
区别 1.应用场景方面RabbitMQ:用于实时的,对可靠性要求较高的消息传递上.kafka:用于处于活跃的流式数据,大数据量的数据处理上.2.架构模型方面producer,broker,consum ...
- js 根据条件删除数组中某个对象&js filter (find)过滤数组对象的使用
删除 ---- item不设置 arr.splice(1,1) //['a','c','d'] 删除起始下标为1,长度为1的一个值,len设置的1,如果为0,则数组不变 arr. ...
- C#中打印拼接的字符串
实例化打印文档 //声明打印对象 PrintDocument pd = new PrintDocument(); int ilvPreviewIndex = 0; 在打印事件中设置基本属性 priva ...
- List集合转JSONObject
以前写代码喜欢用Map拼接返回去给前端,这样得到的也是一个标准的JSON,今天先不说Map的优缺点,我们就来说说JSONObject的使用,我用的是阿里的fastjson,先上代码,当我们需要嵌套代码 ...
- 使用metadata-extractor获取照片中的位置、曝光度、大小...
使用metadata-extractor实现获取图片中的属性信息 官网:https://drewnoakes.com/code/exif/ 简介:metadata-extractor允许您通过简单的A ...
- mysql数据库的连接以及增删改查Java代码实现(转载)
每天叫醒自己的不是闹钟,而是梦想 数据库: create table t1(id int primary key not null auto_increment,name varchar(32),pa ...
- stm32之can总线过滤器研究
stm32的can总线的配置如下: CAN_InitStructure.CAN_TTCM=DISABLE;//禁止时间触发通信模式 CAN_InitStructure.CAN_A ...
- 如何实现Application event,观察者模式
spring 事件为bean 与 bean之间传递消息.一个bean处理完了希望其余一个接着处理.这时我们就需要其余的一个bean监听当前bean所发送的事件. spring事件使用步骤如下: 1.先 ...