E3
1篇 背景介绍
1章 源码阅读2
1.1 源码阅读的意义2
1.2 源码阅读的方法2
1.3 开源软件3
1.4 MyBatis源码4
1.5 本书结构5
1.5.1 背景知识5
1.5.2 文件的指代5
1.5.3 方法的指代8
2章 MyBatis概述10
2.1 背景介绍10
2.1.1 传统数据库连接10
2.1.2 ORM框架11
2.1.3 MyBatis的特点12
2.2 快速上手12
2.2.1 MyBatis包的引入14
2.2.2 MyBatis的简单配置15
2.2.3 基于MyBatis的数据库作16
2.3 MyBatis的核心功能分析17
3章 MyBatis运行初探20
3.1 初始化阶段追踪23
3.1.1 静态代码块的执行23
3.1.2 获取InputStream24
3.1.3 配置信息读取25
3.1.4 总结27
3.2 数据读写阶段追踪27
3.2.1 获得SqlSession27
3.2.2 映接口文件与映文件的绑定28
3.2.3 映接口的代理28
3.2.4 SQL语句的查找31
3.2.5 查询结果缓存31
3.2.6 数据库查询33
3.2.7 处理结果集36
3.2.8 总结39
4章 MyBatis源码结构概述40
4.1 包结构40
4.2 分组结构40
2篇 基础功能包源码阅读
5章 eceptions包44
5.1 背景知识44
5.1.1 Java的异常44
5.1.2 序列化与反序列化45
5.2 Eception类46
5.3 EceptionFactory类47
6章 reflection包48
6.1 背景知识48
6.1.1 装饰器模式48
6.1.2 反50
6.1.3 Type接口及其子类54
6.2 对象工厂子包55
6.3 执行器子包57
6.4 属性子包59
6.5 对象包装器子包61
6.6 反核心类62
6.7 反包装类65
6.8 异常拆包工具65
6.9 参数名解析器68
6.10 泛型解析器69
7章 antations包与lang包76
7.1 Java注解详解76
7.2 Param注解分析78
8章 type包81
8.1 模板模式82
8.2 类型处理器83
8.2.1 类型处理器的基类与实现类83
8.2.2 TypeReference类85
8.3 类型注册表86
9章 io包89
9.1 背景知识89
9.1.1 单例模式89
9.1.2 代理模式89
9.1.3 静态代理90
9.1.4 VFS92
9.2 VFS实现类92
9.2.1 DefaultVFS类94
9.2.2 JBoss6VFS类94
9.3 类文件的加载96
9.4 ResolverUtil类97
10章 logging包100
10.1 背景知识100
10.1.1 适配器模式100
10.1.2 日志框架与日志级别102
10.1.3 基于反的动态代理103
10.2 Log接口105
10.3 Log接口的实现类107
10.4 LogFactory108
10.5 JDBC日志打印109
11章 parsing包113
11.1 背景知识113
11.1.1 XML文件113
11.1.2 XPath115
11.2 XML解析116
11.3 文档解析中的变量替换118
3篇 配置解析包源码阅读
12章 配置解析概述124
13章 binding包128
13.1 数据库作的接入128
13.1.1 数据库作的方法化129
13.1.2 数据库作方法的接入133
13.2 抽象方法与数据库作节点的关联134
13.3 数据库作接入总结136
13.3.1 初始化阶段136
13.3.2 数据读写阶段137
13.4 MyBatis与Spring、Spring Boot的整合137
14章 builder包139
14.1 建造者模式139
14.2 建造者基类与工具类142
14.3 SqlSourceBuilder类与StaticSqlSource类143
14.4 CacheRefResolver类和ResultMapResolver类145
14.4.1 CacheRefResolver类145
14.4.2 ResultMapResolver类146
14.5 ParameterEpression类148
14.6 XML文件解析149
14.6.1 XML文件的声明解析150
14.6.2 配置文件解析151
14.6.3 数据库作语句解析153
14.6.4 Statement解析155
14.6.5 引用解析157
14.7 注解映的解析159
14.7.1 注解映的使用159
14.7.2 注解映解析的触发160
14.7.3 直接注解映的解析164
14.7.4 间接注解映的解析164
15章 mapping包169
15.1 SQL语句处理功能169
15.1.1 MappedStatement类169
15.1.2 SqlSource类170
15.1.3 BoundSql171
15.2 输出结果处理功能171
15.2.1 ResultMap类172
15.2.2 ResultMapping类173
15.2.3 Discriminator174
15.3 输入参数处理功能176
15.4 多数据库种类处理功能176
15.5 其他功能178
16章 scripting包179
16.1 OGNL179
16.2 语言驱动接口及语言驱动注册表183
16.3 SQL节点树的组建186
16.4 SQL节点树的解析189
16.4.1 OGNL辅助类189
16.4.2 表达式求值器193
16.4.3 动态上下文194
16.4.4 SQL节点及其解析196
16.5 再论SqlSource202
16.5.1 SqlSource的生成202
16.5.2 DynamicSqlSource的转化205
16.5.3 RawSqlSource的转化206
16.5.4 SqlSource接口的实现类总结207
17章 datasource包208
17.1 背景知识208
17.1.1 java.sql包和java.sql包208
17.1.2 DriverManager209
17.1.3 DataSource209
17.1.4 Connection210
17.1.5 Statement211
17.2 数据源工厂接口211
17.3 JNDI数据源工厂213
17.4 非池化数据源及工厂214
17.4.1 非池化数据源工厂214
17.4.2 非池化数据源216
17.5 池化数据源218
17.5.1 池化数据源类的属性218
17.5.2 池化连接的给出与收回220
17.5.3 池化连接228
17.6 论数据源工厂229
4篇 核心作包源码阅读
18章 jdbc包232
18.1 AbstractSQL类与SQL类232
18.1.1 SafeAppendable内部类232
18.1.2 SQLStatement内部类233
18.1.3 AbstractSQL类235
18.1.4 SQL类236
18.2 SqlRunner类237
18.3 ScriptRunner类240
18.4 jdbc包的独立性241
19章 cache包243
19.1 背景知识243
19.1.1 Java对象的引用级别243
19.1.2 ReferenceQueue类244
19.2 cache包结构与Cache接口247
19.3 缓存键248
19.3.1 缓存键的原理248
19.3.2 缓存键的生成251
19.4 缓存的实现类252
19.5 缓存装饰器252
19.5.1 同步装饰器253
19.5.2 日志装饰器253
19.5.3 清理装饰器254
19.5.4 阻塞装饰器259
19.5.5 定时清理装饰器262
19.5.6 序列化装饰器263
19.6 缓存的组建264
19.7 事务缓存267
19.8 MyBatis缓存机制271
19.8.1 一级缓存271
19.8.2 二级缓存274
19.8.3 两级缓存机制277
20章 transaction包279
20.1 事务概述279
20.2 事务接口及工厂280
20.3 JDBC事务282
20.4 容器事务283
21章 cursor包284
21.1 Iterable接口与Iterator接口284
21.2 MyBatis中游标的使用285
21.3 游标接口285
21.4 默认游标286
21.4.1 CursorStatus内部类287
21.4.2 ObjectWrapperResultHandler内部类287
21.4.3 CursorIterator内部类288
21.4.4 DefaultCursor外部类289
22章 eecutor包293
22.1 背景知识293
22.1.1 基于cglib的动态代理293
22.1.2 javassist框架的使用295
22.1.3 序列化与反序列化中的方法296
22.1.4 ThreadLocal302
22.1.5 存储过程305
22.1.6 Statement及其子接口306
22.2 主键自增功能308
22.2.1 主键自增的配置与生效308
22.2.2 Jdbc3KeyGenerator类310
22.2.3 SelectKeyGenerator类312
22.3 懒加载功能316
22.3.1 懒加载功能的使用316
22.3.2 懒加载功能的实现318
22.3.3 懒加载功能对序列化和反序列化的支持325
22.4 语句处理功能329
22.4.1 MyBatis对多语句类型的支持329
22.4.2 MyBatis的语句处理功能331
22.5 参数处理功能333
22.6 结果处理功能334
22.7 结果集处理功能336
22.7.1 MyBatis中多结果集的处理337
22.7.2 结果集封装类340
22.7.3 结果集处理器341
22.8 执行器347
22.8.1 执行器接口348
22.8.2 执行器基类与实现类348
22.9 错误上下文352
23章 session包355
23.1 SqlSession及其相关类355
23.1.1 SqlSession的生成链356
23.1.2 DefaultSqlSession类357
23.1.3 SqlSessionManager类358
23.2 Configuration类361
23.3 其他类364
24章 plugin包366
24.1 责任链模式366
24.2 MyBatis插件开发368
24.3 MyBatis拦截器平台370
24.4 MyBatis拦截器链与拦截点373
5篇 总结与展望
25章 源码阅读总结378
25.1 前期准备378
25.1.1 工具准备378
25.1.2 项目选择378
25.1.3 项目使用379
25.2 项目初探379
25.3 源码阅读380
25.3.1 模块分析380
25.3.2 模块归类380
25.3.3 自底向上380
25.3.4 合理猜测381
25.3.5 类比阅读381
25.3.6 善于汇总381
25.3.7 网格阅读382
26章 优秀开源项目推荐383
26.1 Guava383
26.2 Tomcat384
26.3 Redis384
26.4 Dubbo385
26.5 React3851篇 背景介绍
1章 源码阅读2
1.1 源码阅读的意义2
1.2 源码阅读的方法2
1.3 开源软件3
1.4 MyBatis源码4
1.5 本书结构5
1.5.1 背景知识5
1.5.2 文件的指代5
1.5.3 方法的指代8
2章 MyBatis概述10
2.1 背景介绍10
2.1.1 传统数据库连接10
2.1.2 ORM框架11
2.1.3 MyBatis的特点12
2.2 快速上手12
2.2.1 MyBatis包的引入14
2.2.2 MyBatis的简单配置15
2.2.3 基于MyBatis的数据库作16
2.3 MyBatis的核心功能分析17
3章 MyBatis运行初探20
3.1 初始化阶段追踪23
3.1.1 静态代码块的执行23
3.1.2 获取InputStream24
3.1.3 配置信息读取25
3.1.4 总结27
3.2 数据读写阶段追踪27
3.2.1 获得SqlSession27
3.2.2 映接口文件与映文件的绑定28
3.2.3 映接口的代理28
3.2.4 SQL语句的查找31
3.2.5 查询结果缓存31
3.2.6 数据库查询33
3.2.7 处理结果集36
3.2.8 总结39
4章 MyBatis源码结构概述40
4.1 包结构40
4.2 分组结构40
2篇 基础功能包源码阅读
5章 eceptions包44
5.1 背景知识44
5.1.1 Java的异常44
5.1.2 序列化与反序列化45
5.2 Eception类46
5.3 EceptionFactory类47
6章 reflection包48
6.1 背景知识48
6.1.1 装饰器模式48
6.1.2 反50
6.1.3 Type接口及其子类54
6.2 对象工厂子包55
6.3 执行器子包57
6.4 属性子包59
6.5 对象包装器子包61
6.6 反核心类62
6.7 反包装类65
6.8 异常拆包工具65
6.9 参数名解析器68
6.10 泛型解析器69
7章 antations包与lang包76
7.1 Java注解详解76
7.2 Param注解分析78
8章 type包81
8.1 模板模式82
8.2 类型处理器83
8.2.1 类型处理器的基类与实现类83
8.2.2 TypeReference类85
8.3 类型注册表86
9章 io包89
9.1 背景知识89
9.1.1 单例模式89
9.1.2 代理模式89
9.1.3 静态代理90
9.1.4 VFS92
9.2 VFS实现类92
9.2.1 DefaultVFS类94
9.2.2 JBoss6VFS类94
9.3 类文件的加载96
9.4 ResolverUtil类97
10章 logging包100
10.1 背景知识100
10.1.1 适配器模式100
10.1.2 日志框架与日志级别102
10.1.3 基于反的动态代理103
10.2 Log接口105
10.3 Log接口的实现类107
10.4 LogFactory108
10.5 JDBC日志打印109
11章 parsing包113
11.1 背景知识113
11.1.1 XML文件113
11.1.2 XPath115
11.2 XML解析116
11.3 文档解析中的变量替换118
3篇 配置解析包源码阅读
12章 配置解析概述124
13章 binding包128
13.1 数据库作的接入128
13.1.1 数据库作的方法化129
13.1.2 数据库作方法的接入133
13.2 抽象方法与数据库作节点的关联134
13.3 数据库作接入总结136
13.3.1 初始化阶段136
13.3.2 数据读写阶段137
13.4 MyBatis与Spring、Spring Boot的整合137
14章 builder包139
14.1 建造者模式139
14.2 建造者基类与工具类142
14.3 SqlSourceBuilder类与StaticSqlSource类143
14.4 CacheRefResolver类和ResultMapResolver类145
14.4.1 CacheRefResolver类145
14.4.2 ResultMapResolver类146
14.5 ParameterEpression类148
14.6 XML文件解析149
14.6.1 XML文件的声明解析150
14.6.2 配置文件解析151
14.6.3 数据库作语句解析153
14.6.4 Statement解析155
14.6.5 引用解析157
14.7 注解映的解析159
14.7.1 注解映的使用159
14.7.2 注解映解析的触发160
14.7.3 直接注解映的解析164
14.7.4 间接注解映的解析164
15章 mapping包169
15.1 SQL语句处理功能169
15.1.1 MappedStatement类169
15.1.2 SqlSource类170
15.1.3 BoundSql171
15.2 输出结果处理功能171
15.2.1 ResultMap类172
15.2.2 ResultMapping类173
15.2.3 Discriminator174
15.3 输入参数处理功能176
15.4 多数据库种类处理功能176
15.5 其他功能178
16章 scripting包179
16.1 OGNL179
16.2 语言驱动接口及语言驱动注册表183
16.3 SQL节点树的组建186
16.4 SQL节点树的解析189
16.4.1 OGNL辅助类189
16.4.2 表达式求值器193
16.4.3 动态上下文194
16.4.4 SQL节点及其解析196
16.5 再论SqlSource202
16.5.1 SqlSource的生成202
16.5.2 DynamicSqlSource的转化205
16.5.3 RawSqlSource的转化206
16.5.4 SqlSource接口的实现类总结207
17章 datasource包208
17.1 背景知识208
17.1.1 java.sql包和java.sql包208
17.1.2 DriverManager209
17.1.3 DataSource209
17.1.4 Connection210
17.1.5 Statement211
17.2 数据源工厂接口211
17.3 JNDI数据源工厂213
17.4 非池化数据源及工厂214
17.4.1 非池化数据源工厂214
17.4.2 非池化数据源216
17.5 池化数据源218
17.5.1 池化数据源类的属性218
17.5.2 池化连接的给出与收回220
17.5.3 池化连接228
17.6 论数据源工厂229
4篇 核心作包源码阅读
18章 jdbc包232
18.1 AbstractSQL类与SQL类232
18.1.1 SafeAppendable内部类232
18.1.2 SQLStatement内部类233
18.1.3 AbstractSQL类235
18.1.4 SQL类236
18.2 SqlRunner类237
18.3 ScriptRunner类240
18.4 jdbc包的独立性241
19章 cache包243
19.1 背景知识243
19.1.1 Java对象的引用级别243
19.1.2 ReferenceQueue类244
19.2 cache包结构与Cache接口247
19.3 缓存键248
19.3.1 缓存键的原理248
19.3.2 缓存键的生成251
19.4 缓存的实现类252
19.5 缓存装饰器252
19.5.1 同步装饰器253
19.5.2 日志装饰器253
19.5.3 清理装饰器254
19.5.4 阻塞装饰器259
19.5.5 定时清理装饰器262
19.5.6 序列化装饰器263
19.6 缓存的组建264
19.7 事务缓存267
19.8 MyBatis缓存机制271
19.8.1 一级缓存271
19.8.2 二级缓存274
19.8.3 两级缓存机制277
20章 transaction包279
20.1 事务概述279
20.2 事务接口及工厂280
20.3 JDBC事务282
20.4 容器事务283
21章 cursor包284
21.1 Iterable接口与Iterator接口284
21.2 MyBatis中游标的使用285
21.3 游标接口285
21.4 默认游标286
21.4.1 CursorStatus内部类287
21.4.2 ObjectWrapperResultHandler内部类287
21.4.3 CursorIterator内部类288
21.4.4 DefaultCursor外部类289
22章 eecutor包293
22.1 背景知识293
22.1.1 基于cglib的动态代理293
22.1.2 javassist框架的使用295
22.1.3 序列化与反序列化中的方法296
22.1.4 ThreadLocal302
22.1.5 存储过程305
22.1.6 Statement及其子接口306
22.2 主键自增功能308
22.2.1 主键自增的配置与生效308
22.2.2 Jdbc3KeyGenerator类310
22.2.3 SelectKeyGenerator类312
22.3 懒加载功能316
22.3.1 懒加载功能的使用316
22.3.2 懒加载功能的实现318
22.3.3 懒加载功能对序列化和反序列化的支持325
22.4 语句处理功能329
22.4.1 MyBatis对多语句类型的支持329
22.4.2 MyBatis的语句处理功能331
22.5 参数处理功能333
22.6 结果处理功能334
22.7 结果集处理功能336
22.7.1 MyBatis中多结果集的处理337
22.7.2 结果集封装类340
22.7.3 结果集处理器341
22.8 执行器347
22.8.1 执行器接口348
22.8.2 执行器基类与实现类348
22.9 错误上下文352
23章 session包355
23.1 SqlSession及其相关类355
23.1.1 SqlSession的生成链356
23.1.2 DefaultSqlSession类357
23.1.3 SqlSessionManager类358
23.2 Configuration类361
23.3 其他类364
24章 plugin包366
24.1 责任链模式366
24.2 MyBatis插件开发368
24.3 MyBatis拦截器平台370
24.4 MyBatis拦截器链与拦截点373
5篇 总结与展望
25章 源码阅读总结378
25.1 前期准备378
25.1.1 工具准备378
25.1.2 项目选择378
25.1.3 项目使用379
25.2 项目初探379
25.3 源码阅读380
25.3.1 模块分析380
25.3.2 模块归类380
25.3.3 自底向上380
25.3.4 合理猜测381
25.3.5 类比阅读381
25.3.6 善于汇总381
25.3.7 网格阅读382
26章 优秀开源项目推荐383
26.1 Guava383
26.2 Tomcat384
26.3 Redis384
26.4 Dubbo385
26.5 React385