啃下MyBatis源码系列目录
啃下MyBatis源码 - 为什么要看MyBatis源码及源码结构
啃下MyBatis源码 - org.apache.ibatis.logging包源码分析
啃下MyBatis源码 - org.apache.ibatis.datasource包源码分析
啃下MyBatis源码 - org.apache.ibatis.cache包源码分析
啃下MyBatis源码 - MyBatis核心流程三大阶段之初始化阶段
啃下MyBatis源码 - MyBatis核心流程三大阶段之代理阶段(binding模块分析)
啃下MyBatis源码 - MyBatis核心流程三大阶段之数据读写阶段
--------------------------------------------------------------------------------------------------------------------------
目录
1.为什么要去看MyBatis源码?
此问题全是出于一个java小白的角度,大佬请自行略过。。。个人感觉阅读源码的前提是java基础最起码需要掌握90%,剩下的10%需要在看源码的过程中查漏补缺,如并发编程,可以不知道synchronized、ReentrantLock等并发锁的底层原理,但最起码要保证写出的Demo代码可以看懂(由于并发编程没学好,导致看MyBatis的Cache模块略青涩。。。)。看源码的好处呢,我感觉有以下几点:
(1)学习大佬们的编码思想及规范
(2)学习一些传承下来的设计模式
(3)实践java基础理论
1.学习大佬们的编码思想及规范:俗话说的好,站在前人的肩膀上才能尿的更远,阅读源码可以了解大佬们的编程思想,给我印象最深刻的就是MyBatis数据源模块PooledDataSource类,在资源的请求和释放的函数中对null连接的判断(个人感觉很牛逼,也可能是我太菜了)。。。
2.学习一些传承下来的设计模式:以前看设计模式没有从实际需求入手,从网上背下来一堆概念,背了忘,忘了背,也不知道这些设计模式究竟要解决什么问题。看了MyBatis日志模块,才真正的知道了什么是适配器模式。日志模块需求:MyBatis要对接不同的第三方日志,这些第三方日志都有自己定义好的日志级别且各不相同,那么适配器模式就是解决这个问题的,看完了源码才真正的了解关于适配器模式的描述“为两个不兼容的接口之间的桥梁”这句话的含义。可能一段时间之后MyBatis的源码会忘的渣都不剩,但只要一想起日志模块的需求,就会想起适配器模式。对以后面试也有好处,最起码和面试官有的聊了,可以给面试官举个例子了,不像以前上去就开始背概念(是真的记不住)
3.实践java基础理论:MyBatis提供了丰富的test测试模块代码,去github上把源码down下来用maven导入,源码随便改,随便写,随便debug,真的不要太爽。
看源码缺点:对于基础不扎实或者实践能力少的同鞋来说不太友好(没错就是我。。。)
2.MyBatis源码结构
2.1 源码包功能模块图
2.2 各包详细功能解析
org.apache.ibatis.logging:包含所有mapper 接口中用到的注解
org.apache.ibatis.binding:生成mapper 接口的动态代理并进行管理
org.apache.ibatis.builder:
- 包含Configuration对象所有构建器,主要包括XML、注解2种方式配置解析
- BaseBuilder 构建器基类
- XMLConfigBuilder 解析configuration.xml配置文件
- XMLMapperBuilder 解析Mapper.xml配置文件
- XMLStatementBuilder 解析select\update\delete 标签
- MapperAnnotationBuilder 注解式Mapper
org.apache.ibatis.cache:
- 缓存功能实现、包含各种缓存装饰器
- TransactionalCache 二级缓存功能实现
org.apache.ibatis.cursor:实现游标的方式查询数据、游标非常适合处理百万级别的数据查询
org.apache.ibatis.datasource:数据源 包括jndi数据源、连接池功能
org.apache.ibatis.executor:
- 包含SQL语句执行器,核心功能包
- 功能包括:主键生成功能、执行参数解析功能、执行结果集解析功能、SQL执行器、缓存执行器
org.apache.ibatis.exceptions:框架异常,常见异常:TooManyResultsException
org.apache.ibatis.io:资源文件读取
org.apache.ibatis.jdbc:
- JDBC一些操作
- SqlRunner SQL执行
- ScriptRunner 脚本执行,可以执行建库语句
org.apache.ibatis.logging:
- 日志功能,实现多种日志框架的对接
- org.apache.ibatis.logging.jdbc 代理所有功能JDBC 操作,实现了在debug模式下能够输出SQL
org.apache.ibatis.mapping:配置文件与实体对象的映射功能,Mapper映射、参数映射、结果映射等
org.apache.ibatis.parsing:
- 解析工具包
- GenericTokenParser:解析#{} ${} 这种占位符
- XPathParser:XPath形式解析XML
- PropertyParser: properties解析器
org.apache.ibatis.scripting:动态SQL语言实现,配置文件中<if> <where> <set> <foreach> <choose> 功能就是在这个包实现,借助OGNL表达式,你也可以扩展自己的语言实现功能
org.apache.ibatis.session:
- 主要实现SqlSession功能,非常核心包
- 官方注释:SqlSession包含了MyBatis工作的所有的Java接口,通过这些接口你可以 执行SQL命令(insert\delete\update\select),获取Mapper,管理实务
org.apache.ibatis.transaction:事务功能实现,包装了数据库连接,处理数据库连接生命周期包括:连接创建,预编译,提交\回滚和关闭
org.apache.ibatis.type:类型处理器,包括所有数据库类型对应Java类型的处理器,如果要实现自己类型处理器就需要实现包下的基础接口