MyBatis设计思想(1)——整体架构
一. 源码结构
- annotatios:注解开发模块,定义所有mapper 接口中用到的注解,例如常用的 @Param,@Update、@Select、@Delete 等。
- binding:生成mapper接口的动态代理类,并对其生命周期进行管理。
- builder:定义了MyBatis内部所需的所有构建器,MyBatis的核心组件大部分都是通过Builder模式创建的。
- cache:缓存功能实现,包含各种缓存装饰器,MyBatis一级缓存、二级缓存都基于这个模块。
- cursor:支持游标的方式的数据查询,比较适合处理大数据量的查询场景。
- datasource:数据源模块,MyBatis实现了自己的数据源。
- exceptions:定义了常用的异常。
- executor:执行器模块,定义了MyBatis的核心处理流程,主要功能包括:Statement创建、SQL参数拼接、SQL语句执行、结果集解析等。
- io:资源文件读取模块,用于定位、读取MyBatis相关的配置信息。
- jdbc:提供了一些JDBC的工具类。
- lang:这个包只有2个注解:@UsesJava7、@UsesJava8 ,使用这个两个注解标识哪些可以使用JDK7 API 哪些可以使用JDK8 API。
- logging:日志模块,自定义了日志级别,并对多种日志框架进行了整合。
- mapping:主要提供了配置文件与实体对象的映射功能,包括Mapper映射、参数映射、结果集映射等。
- parsing:字符串解析工具包,如解析SQL语句中"$"、"#"这种占位符。
- plugin:插件模块,使用代理模式实现功能的增强。著名的分页插件PageHelper就是基于plugin模块实现的。
- reflection:反射模块,对Java底层的反射机制进行封装,并提供了一系列的反射工具类。
- scripting:动态SQL语言实现,配置文件中if、where等SQL标签的功能就是在这个包中实现的。
- session:核心模块,实现了SqlSession的功能。
- transaction:事务模块,实现了JDBC事务的基础功能。
- type:类型处理模块,包括所有数据库类型和对应Java类型的转换器。
二. 整体架构
- 基础支撑层:主要面向底层技术,提供了一系列业务无关的通用能力,对核心处理层提供支持。基础支撑层的很多组件都可以单独拿出来放在我们自己的项目里使用。
- 核心处理层:MyBatis对原生JDBC的各处理流程进行了抽象和封装。
- 接口层:对外统一暴露了SqlSession和Mapper接口进行数据库操作,屏蔽了底层的实现细节。
三. 门面模式
从MyBatis的整体架构来看,它实现了门面模式,SqlSession就相当于一个Facade,内部聚合了MyBatis核心处理层的各个组件,来实现对数据库的各种操作,而对外屏蔽了复杂的逻辑处理,仅保留简单的API供客户端使用。这样一来,客户端无需关心MyBatis内部的实现细节,减少了用户的理解和学习成本。