mybatis 的前身是 iBatis, 其源于 "Internet" 和 "abatis" 的组合, 是一款优秀的持久层框架, 它支持定制化 SQL, 存储过程以及高级映射. mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集, 它可以使用简单的 xml 或注解来配置和映射原生信息, 将接口和 Java 的 POJO 映射成数据库中的记录.
Mybatis 的架构设计
Mybatis 的功能架构分为三层:
接口层: 提供给外部使用的接口 API, 开发人员通过这些本地 API 来操纵数据库. 接口层接收到调用请求就会调用数据处理层来完成具体的数据处理.
数据处理层: 负责具体的 SQL 查找, SQL 解析, SQL 执行和执行结果映射处理等. 它主要的目的是根据调用的请求完成一次数据库操作.
框架支撑层: 负责最基础的功能支撑, 包括连接管理, 事务管理, 配置加载和缓存处理, 这些都是共用的东西, 将他们抽取出来作为最基础的组件. 为上层的数据处理层提供最基础的支撑.
mybatis 的运行流程
1. 加载配置: 配置来源于两个地方, 配置文件和注解. 将 SQL 的配置信息加载成为 MappedStatement 对象(包括了传入参数映射配置, 执行的 SQL 语句, 结果映射配置), 存储在内存中.
2.SQL 解析: 当 API 接口层接收到调用请求时, 会接收到传入 SQL 的 ID 和传入对象(可以是 Map,JavaBean 或者基本数据类型),Mybatis 会根据 SQL 的 ID 找到对应的 MappedStatement, 然后根据传入参数对象对 MappedStatement 进行解析, 解析后可以得到最终要执行的 SQL 语句和参数.
3.SQL 执行: 将最终得到的 SQL 和参数拿到数据库进行执行, 得到操作数据库的结果.
4. 结果映射: 将操作数据库的结果按照映射的配置进行转换, 可以转换成 HashMap,JavaBean 或者基本数据类型, 并将最终结果返回.
手写 mybatis 的目录
来看下笔者的手写 mybatis 的文件目录. 查看 Bootstrap 文件上说明, 然后运行该文件, 断点调试即可一步步了解 mybatis 框架的原理了.(很多地方都注解了, 方便初学者更多了解框架细节)
代码地址请查看, https://github.com/y277an/java-you-need-know. 再看看正版的代码结构吧.
考虑到 transaction 对理解框架原理产生干扰, 所以代码全部删掉
mybatis 目录结构及内容
以下目录对照的是 mybatis-3.5.1 的源码.
annotations. 注解目录. 包括所有的注解, 如 @SELECT,@UPDATE 等.
binding.Mapper 类的实例反射生成工具目录.
builder. 主要是注解, mapper 和 SqlSource 的构造器及转换器.
cache.Mybatis 内部缓存接口. 实现了一些特定的缓存策略, FifoCache,LruCache,BlockingCache,LoggingCache 等.
dataSource. 数据源工厂类及实现. 实现类包括 JndiDataSourceFactory,PooledDataSourceFactory 和 UnpooledDataSourceFactory. 数据源实现类: UnpooledDataSource 和 PooledDataSource.
exceptions.Mybatis 自定义的异常类, 都继承自 RuntimeException.
executor. 执行器相关包. 包括 Key 生成器, 加载器 (包括 Cglib,Javassist 的代理, 结果加载器), 参数处理器接口, 结果处理器, 结果集(resultSet) 处理器, Statement 处理器(实现类: BaseStatementHandler,CallableStatementHandler,PreparedStatementHandler,RoutingStatementHandler,SimpleStatementHandler), 执行器(SimpleExecutor,ReuseExecutor,CachingExecutor,BatchExecutor,BaseExecutor).
io. 主要是定义的几个 VFS(VFS,DefaultVFS,ClassLoaderWrapper).
jdbc. 与 Sql 相关的操作. 如 Sql 运行器, 脚本运行器和 Sql 封装类等.
logging. 各个类型的日志适配器, 都实现了 Log 接口. StdOutImpl,Slf4jImpl,NoLoggingImpl,Log4j2Impl,Log4jImpl,Jdk14LoggingImpl,BaseJdbcLogger 和 JakartaCommonsLoggingImpl.
mapping. 主要是接口参数, sql 和返回结果的映射类, 主要类包括: MappedStatement,ParameterMap,ParameterMapping,ResultMap,ResultMapping,BoundSql 和 SqlSource 等类.
parsing. 变量解析, 如解析 ${},#{}等.
plugin. 主要包含插件的定义接口. 如 Interceptor,Plugin 和 InterceptorChain 等.
reflection. 主要是一些反射操作的工具方法和对象工厂类, 以及一些常用的包装类, 如 BaseWrapper,BeanWrapper,CollectionWrapper,MapWrapper 和 ObjectWrapper.
scripting. 执行驱动和动态 Sql 解析的处理器.
session. 主要是 SqlSession 和 SqlSessionFactory.
transaction. 主要是 mybatis 简单封装的 jdbc 事务操作类.
type. 各个类型数据的处理器. 用于动态的设置参数和转换数据, 如 IntegerTypeHandler 用来处理 Integer 类型的值的 set 和 get 操作. 除了八大基本类型, 还有常用的集合及 Map 类型, 还增加了各种时间类型的处理器.
MyBatis 的核心成员和职责
从 MyBatis 代码实现的角度来看, MyBatis 的核心组件如下
SqlSession. 作为 MyBatis 工作的主要顶层 API, 表示和数据库交互的会话, 完成必要数据库增删改查功能.
Executor.MyBatis 执行器, 是 MyBatis 调度的核心, 负责 SQL 语句的生成和查询缓存的维护.
StatementHandler. 封装了 JDBC Statement 操作, 负责对 JDBCstatement 的操作, 如设置参数, 将 Statement 结果集转换成 List 集合.
ParameterHandler. 负责对用户传递的参数转换成 JDBC Statement 所需要的参数.
ResultSetHandler. 负责将 JDBC 返回的 ResultSet 结果集对象转换成 List 类型的集合.
TypeHandler 负责 java 数据类型和 jdbc 数据类型之间的映射和转换.
MappedStatement.MappedStatement 维护了一条 < select|update|delete|insert > 节点的封装.
SqlSource. 负责根据用户传递的 parameterObject, 动态地生成 SQL 语句, 将信息封装到 BoundSql 对象中, 并返回.
BoundSql. 表示动态生成的 SQL 语句以及相应的参数信息.
Configuration.MyBatis 所有的配置信息都维持在 Configuration 对象之中.
来源: http://www.bubuko.com/infodetail-3201810.html