一、前言
- 工作三年了,各种开发框架也用的十分熟练。现在学习的时候渐渐也不满足使用上,所以开始涉猎源码,也是希望自己的技术能力能更近一步,自己想法也是从Mybatis框架源码开始,在博客上记录下,和大家一步进步
二、ORM框架
- 传统JDBC常见的步骤:
- 注册数据库驱动类
- 通过DriverManager打开数据库连接
- 通过连接创建相应的Statement
- 通过Statement执行相应的SQL语句,若是查询语句则得到ResultSet
- 通过ResultSet读取数据,并转化为相应的JavaBean
- 关闭资源
- 上述操作中我们关注点只有SQL语句的执行,其它操作重复且繁杂。早期的时候为了提高代码的可复用性,通常将重复性代码封装到一个类似DBUtils的工具类中。但是关系模型到对象模型的转换依然复杂,所以ORM框架应运而生
- ORM的提供的功能:
- 根据映射配置文件,实现对象模型和关系模型之间的映射,同时也屏蔽了上述重复代码
- Hibernate:
- 通过hbm.xml文件维护对象模型和关系模型之间的映射。通过该映射,开发人员可以通过看待Java的角度去看待数据库中的数据行
- 优点:
- HIbernate还能够屏蔽数据库的底层差异,以至于可以切换不同的数据库而程序不受影响。
- API没有侵入性,业务逻辑不需要继承Hibernate的任何接口
- 缺点
- 并不是数据库中所有的概念在面向对象的世界中都能找到对应关系,比如索引、存储过程以及函数等
- SQL优化比较困难
- Spring JDBC:
- 并不算一个ORM框架,仅仅使用模板方法的设计模式对原生JDBC进行了一层薄封装,它没有映射文件、缓存等概念,而是直接执行原生SQL语句
- 优点:
- 屏蔽了数据库连接创建等重复性代码,提升了开发效率
- 提供了很多template类,可以将对象中的属性映射为SQL中的参数
- 提供了很多ORM化的callback,可以将ResultSet转化成相应的对象列表
- Spring JDBC本身就位于核心包中,和Spring框架无缝连接
- Mybatis:
- Mybatis是对JDBC的一层封装,帮助开发人员屏蔽了底层代码的重复性
- 优点:
- 相比于Hibernate更加轻量级,可控性也更高
- 可以进行SQL优化
三、Mybatis整体架构简述
- MyBatis整体架构分为三层:接口层、核心处理层、基础支持层
- 接口层:
- 核心是SqlSession接口,它暴露了Mybatis提供给开发人员的API,接口层在接收到相应的请求时,会调用核心处理层的相应模块来完成具体操作
- 核心处理层:
- 核心处理层实现了Mybatis核心处理流程,其中包括Mybatis的初始化以及完成一次数据库操作涉及的全部流程
- 组成:
- 配置解析,解析配置文件如核心配置文件解析成功后会生成Configuration对象
- SQL解析,用于解析动态SQL
- SQL执行,用于执行SQL,其涉及到多个模块Executor、ParameterHandler、StatementHandler以及ResultSetHandler
- 插件,可以通过添加自定义插件的方式对Mybatis进行扩展
- 基础支持层:
- 为核心处理层提供了良好的支持,并提供了可观的代码复用
- 组成:
- 反射模块,对JDK反射的封装
- 类型转换模块,别名机制是类型转换模块中重要机制,实现了JDBC类型和JAVA类型之间的转换
- 日志模块,用于日志记录
- 资源加载模块,对类加载器的封装
- 解析器模块,一是对XPath的封装,为初始化加载解析配置文件提供支持。二是为处理动态SQL语句中的占位符提供支持
- 数据源模块,mybatis提供了相应的数据源实现,也提供了与第三方数据源集成的接口
- 事务管理模块,对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。
- 缓存模块,提供了一级缓存二级缓存
- binding模块,将用户自定义的mapper接口与映射配置文件关联起来