前言:一直以来,很多人都是拿来主义,只停留在会使用的阶段,从未去研究挖掘其原理,剖析本质。现在慢慢探讨一下其内幕,抛砖引玉
一、简介
1)常用的持久化框架
Hibernate
:是一款Java
世界中最著名的ORM
框架之一JPA(Java Persistence API)
: 是EJB 3 .0
中持久化部分的规范,但它可以脱离EJB
的体系单
独作为一个持久化规范进行使用Spring JDBC
:严格来说,Sring JDBC
不能算是一个ORM
架,它仅仅是使用模板方式对原生DBC
行了一层非常薄的封装MyBatis
:MyBatis
前身是Apache
基金会的开源项目iBatis
,在2010 年该项目脱离Apache
基金会并正式更名为MyBatis
2)使用步骤
- 传统的
JDBC
编程中的查询操作为例进行说明,其主要步骤如下:- 1 注册数据库驱动类 ,明确指定数据库
URL
地址、数据库用户名、密码等连接信息 - 2 通过
DriverManager
打开数据库连接 - 3 通过数据库连接创建
Statement
对象 - 4 通过
Statement
对象执行SQL
语句,得到ResultSet
对象 - 5 通过
ResultSet
读取数据,并将数据转换成JavaBean
对象 - 6 关闭
ResultSet
、Statement
对象以及数据库连接,释放相关资源
java操作数据库
- 1 注册数据库驱动类 ,明确指定数据库
- 使用
MyBatis
,其主要步骤如下:- 1 配置
mybatis-config.xml
配置文件, 配置数据库的URL
地址、数据库用户名和密码、别名信息、映射配置文件的位置以及一些全局配置信息 - 2 应用程序首先会加载
mybatis-config.xml
配置文件 - 3 井根据配置文件的内容创建
SqlSessionFactory
对象 - 4 通过
SqlSessionFactory
对象创建SqlSession
对象,SqlSession
接口中定义了执行SQL语句所需要的各种方法 - 5 通过
SqlSession
对象执行映射配置文件中定义的SQL
语句,完成相应的数据操作 - 6 通过
SqlSession
对象提交事务,关闭SqlSession
对象
- 1 配置
3)Mybatis整体架构
- 整体结构图
- 一条sql大致的执行过程
① 基础支持层
反射模块
- 反射工具箱:在进行参数处理、结果映射等操作时,会涉及大量的反射操作,
Java
中的反射虽然功能强大,但是代码编写起来比较复杂且容易出错,为了简化反射操作的相关代码,MyBatis
提供了专门的反射模块,该模块位于org.apache.ibatis.reflection
包中,它对常见的反射操作做了进一步封装,提供了更加简洁方便的反射API
- 反射工具箱:在进行参数处理、结果映射等操作时,会涉及大量的反射操作,
类型转换模块
- 功能
- 1 别名机制
- 2 转换机制:在为
SQL
语句绑定实参时, 会将数据由Java
类型转换成JDBC
类型;而在映射结果集时,会将数据由JDBC
类型转换成 Java 类型
- 功能
日志模块:
- 功能
- 1 提供详细的日志输出信息
- 2 集成第三方日志框架
- 功能
资源加载模块
- 功能
- 1 对类加载器进行封装,确定类加载器的使用顺序
- 2 提供了加载类文件以及其他资源文件的功能
- 功能
解析器模块
- 功能
- 1 对
XPath
进行封装,为MyBatis
初始化时解析mybatis-config.xml
配置文件以及映射配置文件提供支持 - 2 为处理动态
SQL
语句中的占位符提供支持
- 1 对
- 功能
数据源模块:提供了与第三方数据源集成的接口,这些功能都位于数据源模块之中
事务管理:对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现,与
Spring
框架集成,并由Spring
框架管理事务缓存模块
- 功能
- 1 提供一级缓存和二级缓存
- 简单的缓存使用图
注意:MyBatis
中自带的这两级缓存与MyBatis
以及整个应用是运行在同一个JVM
中的,共享同一块堆内存。如果这两级缓存中的数据量较大, 则可能影响系统中其他功能的运行,所以当需要缓存大量数据时 ,优先考虑使用Redis
、Memcache
等缓存产品
Binding
模块:MyBatis
通过Binding
模块将用户自定义的Mapper
接口与映射配置文件关联起来,系统可以通过调用自定义Mapper
接口中的方法执行相应的SQL
语句完成数据库操作,开发人员无须编写自定义Mapper
接口的实现,MyBatis
会自动为其创建动态代理对象
② 核心处理层
- 配置解析
- 在
MyBatis
初始化过程中,会加载mybatis-config.xml
配置文件、映射配置文件以及Mapper
接口中的注解信息,解析后的配置信息会形成相应的对象并保存到Configuration
对象中
- 在
SOL
解析与scripting
模块- 为了将开发人员从这项枯燥无趣的工作中解脱出来,
MyBatis
实现动态SQL
语句的功能,提供了多种动态SQL
语句对应的节点 scripting
模块会根据用户传入的实参,解析映射文件中定义的动态SQL
节点,并形成数据库可执行的SQL
语句 。之后会处理SQL
语句中的占位符,绑定用户传入的实参
- 为了将开发人员从这项枯燥无趣的工作中解脱出来,
SOL
执行:语句的执行涉及多个组件 ,其中比较重要的是Executor
、StatementHandler
、ParameterHandler
和ResulSetHandler
,步骤如下:- 1
Executor
主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作 ,它会将数据库相关操作委托给StatementHandler
完成 - 2
StatementHandler
首先通过ParameterHandler
完成SQL
语句的实参绑定,然后通过java.sql.Statement
对象执行SQL
语句并得到结果集 - 3 最后通过
ResultSetHandler
完成结果集的映射,得到结果对象并返回
- 1
- 插件:可以通过添加用户自定义插件的方式对
MyBatis
进行扩展,用户自定义插件也可以改变Mybatis
的默认行为
③ 接口层
- 接口层相对简单,其核心是
SqlSession
接口,该接口中定义了MyBatis
暴露给应用程序调用的API
,也就是上层应用与MyBatis
交互的桥梁。接口层在接收到调用请求时,会调用核心处理层的相应模块来完成具体的数据库操作
总结
- 本篇简单介绍了 MyBatis 整体架构及各层之间的功能。若要用好并深入,请关注下一篇原理剖析篇