[架构设计]Mybatis的架构设计

664 阅读3分钟

前言

做Java很多年了,从入行开始就是使用Mybatis,从springMVC过渡到spring boot,使用过程中也觉得很好用,可能是没经历过手写jdbc链接池的年代,所以没有那种,啊,终于啊,你来了的感受。就像现在的小孩子,根本不知道用手摆一个六放在脸边上为啥就是啥电话的意思,时代让我们变得幸福。

废话说了不少,今天主要是想聊聊Mybatis为啥存在着。

起源

在手写jdbc链接池的时代,我们首先要自己加载jdbc的驱动,然后去创建一个connection,然后自己手写String 的sql,然后再去一个个配置参数,最后返回的的结果我们再去一个个遍历key和value赋值到我们自己定义的pojo类。听起来就很麻烦,这还是一小部分,因为要硬编码,所以我们更换数据驱动,要在写一套,换表名,再写一套,数据结构变化,还要改代码。这还不是关键的,我们还要为了不频繁创建连接,要自己手写连接池,要自己去处理不同的数据库的差异,问题一堆,关键是,每次改动,回归的范围还很大,开发的痛点集中在了明明不需要那么关系的数据捞取环节,很繁琐,所以,Mybatis就来了。

MyBatis简介

1、首先Mybatis是一款ORM的半自动轻量级持久层框架。

2、使用xml或注解来映射原生类型、接口和java的POJO为数据库中的对象。

ORM就是关系型映射的概念,可以吧关系型数据库包装成对象。 半自动的意思就是我们还是需要自己去手写一些sql来帮我们完成查询功能,这点主要区别于Hibernate。 轻量级不用多说,mybatis的核心能力重点关注在ORM关系映射,没有那么的沉重,也没有那么多的依赖,这也是其风靡的一个原因。

Mybatis解决的问题

1、数据库不需要频繁创建连接 2、解决代码硬编码 3、创建关系映射,将数据库结构映射到pojo对象

Mybatis流程

image.png

Mybatis的架构设计

image.png

Mybatis也是一个分层架构,根据一个实际需要执行的sql,进行了三层的设计。

  • 接口层:对外暴露接口,提供增删改查及配置的能力。
  • 数据处理层:用来解析sql,将sql中的参数映射到数据库,并提供执行sql的能力,同时提供讲数据库中的数据元素映射到java对象的封装
  • 框架支撑层:提供最基础能力用来支撑框架,比如事务管理,缓存的处理,连接池的维护,配置加载等。

Mybatis主要组件

组件描述
SqlSession作为Mybatis工作的主要顶层API,表示和数据库交互的回话,完成必要的数据库增删改查功能
ExecutorMybatis的执行器,Mybatis的核心能力,负责Sql语句的生成和查询结构的缓存及其维护
StatementHandler封装了JDBC Statement操作,负责对JDBC statement操作,同时将Statement结果转换为List集合
ParameterHandler负责对用户传递的参数转化换成JDBC Statement所需要的参数。
ResultSetHandler负责将JDBC返回的ResultSet结果集对象转换成List集合
TypeHandler负责java数据对象和jdbc数据类型之间的映射和转换,ORM关系型数据库的特点
MappedStatement维护了select/update/delete/insert 节点的封装
SqlSource负责根据用户传递的parameterObject,动态的生成Sql语句,将信息封装在BoundSql中。
BoundSql标识动态生成的Sql语句及相关的参数信息

Mybatis处理流程

image.png