MyBatis(技术NeiMu):整体架构

ORM

什么是ORM呢?

首先我们来认识一下JDBC,JDBC是Java与数据库交互的统一API,其实JDBC分为两组API

  • 一组是面向Java应用程序开发人员的API
  • 另一组是面向数据库驱动程序开发人员的API

这两组怎么进行区分呢?

前者是一个标准的Java API,是独立于各个数据库厂家来实现的;而后者则是交由数据库驱动开发人员用于编写数据库驱动的,是前者的底层支持,不同的数据库会有不同的API

回顾正题

ORM是指Object Relational Mapping,既对象关系映射,说白了其只是屏蔽了JDBC冗余的代码并且可以根据配置文件来自定义数据库行数据与Java Bean之间的映射关系
在这里插入图片描述
同时根据配置文件的配置信息去减少冗余操作,比如

  • 注册数据库驱动类
  • 通过DriverManager打开数据库连接
  • 通过数据库连接创建Statement对象
  • 通过Statement对象执行SQL语句,得到ResultSet对象
  • 通过ResultSet对象读取数据,并将数据转换成Java Bean对象
  • 关闭资源,比如连接Connection、Statement、ResultSet

MyBatis相较于现在其他的ORM框架,比如Hibernate、JPA,算是比较轻量级的,并且有较高的可控性,因为对于MyBatis执行的SQL语句全部都是基于配置文件里面的原生SQL,或者注解里面的原生SQL,执行原生SQL可以给我们直接优化SQL的机会,但同时也会带来一些不利之处,比如突然把表名改了,或者列名改了,进行一些DDL操作时,会影响到配置文件里面的很多关联SQL(这方面JPA映射比较好)

MyBatis的整体架构

MyBatis的整体架构分为三层

  • 基础支持层
  • 核心处理层
  • 接口层

下面就来看一下这三层的功能

基础支持层

基础基础层包含整个MyBatis的基础模块,主要为核心处理层提供服务

  • 反射模块:该模块对Java原生的反射进行了良好的封装,并且对反射进行了一系列优化
  • 类型转换模块:该模块就是负责数据库行数据转换为Java Bean的映射
  • 日志模块:该模块负责输出日志,当然可以去集成一些其他的日志框架
  • 资源加载模块:该模块负责加载资源,主要是对类加载器进行封装,确定类加载的顺序,提供加载类或其他文件的功能
  • 解析器模块:该模块用于解析配置文件,解析配置文件的底层使用的是XPath,所以解析器模块是对XPath进行封装
  • 数据源模块:该模块负责数据源的管理,使用MyBatis自己实现的数据源或者使用第三方的数据源
  • 事务管理:该模块提供了事务接口和简单实现
  • 缓存模块:该模块负责缓存,缓存一些查询的结果集,可以将一部分数据库请求拦截在缓存这一层,减少了数据库的压力,并且提升了性能,这里要注意的是MyBatis提供了一级缓存和二级缓存,这两个缓存都是跟整个应用运行在JVM中的,共享着同一块的堆内存,所以当这两个缓存太大的时候是会影响系统中其他功能的运行,所以当需要缓存大量数据时,还是要考虑使用Redis、Memcache等缓存产品
  • Binding模块:这个模块负责Java接口与配置文件的绑定的,用MyBatis的时候,写配置文件的时候需要绑定一个接口,该模块就是负责这方面的实现,并且这里要注意,为什么我们接口明明没有实现却可以通过MyBatis调用,这是因为MyBatis生成了一个动态代理对象

核心处理层

核心处理层其实就是调用基础支持层提供的一系列功能模块,来实现核心功能

  • 配置解析:加载MyBatis-config.xml配置文件、接口的映射配置文件还有接口中的注解信息,解析后的信息会形成对应的对象并保存到Configuration对象中,比如一个标签,会被解析成一个ResultMap对象,后面会利用Configuration对象创建SqlSessionFactory对象,然后使用SqlSessionFactory对象创建SqlSession对象并完成数据库操作
  • SQL解析与scripting模块:实现动态SQL功能,提供了多种动态SQL语句对应的结点,比如、,而scripting则是根据用户传入的实参,解析配置文件中定义的动态SQL节点,形成数据库可执行的SQL语句,然后处理SQL语句中的占位符,绑定用户传入的实参
  • SQL执行:执行SQL,但这个执行动作确涉及到了多个组件,其中比较重要的是Executor,StatementHandler、ParameterHandler和ResultSetHandler
    • Executor负责维护一级缓存和二级缓存,提供事务管理等相关操作,并调用StatementHandler去完成数据库相关的操作
    • StatementHandler完成数据库相关的操作,首先通过PrameterHandler完成SQL语句的参数绑定,然后使用Statement对象执行SQL语句并得到结果集(Statement、PrepareStatement),最后通过ResultSetHandler完成结果集的映射,得到结果对象并返回

接口层

接口层比较简单,就只有一个SqlSession接口,该接口其实就是MyBatis暴露给应用程序调用的API,说白了SqlSession接口其实就是应用程序与MyBatis交互的桥梁

看完了整体架构,就来看看一句Sql在MyBatis到底是如何执行的

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值