iBATIS框架源码剖析

【书名】iBATIS框架源码剖析
【作者】任  钢   编著
【ISBN】978-7-121-10872-3
【出版社】电子工业出版社
【出版日期】2010年6月
【宣传语】
iBATIS——目前主流的ORM框架
Java软件设计师、架构师案头必备参考用书
【内容简介】
iBATIS是一种比较流行的ORM框架,本书全面介绍其结构体系和分析其源程序代码,该框架的核心包括两个组件,一个是iBATIS DAO,另一个是iBATIS SQL Map。
本书分为三个部分,第一部分是介绍iBATIS的一些基础知识;第二部分是介绍iBATIS DAO的框架结构及其实现;第三部分是针对iBATIS的底层平台iBATIS SQL Map进行分析。其中第三部分是主要内容:首先剖析了SQL Map是如何读取配置信息的;其次说明了SQL Map引擎的实现,勾画出iBATIS SQL Map的框架结构,描述其核心实现机制和主要实现步骤;再次说明SQL Map如何用来实现数据库处理,包括事务管理、数据库连接池,以及SQL Map中Mapping的实现,这也是iBATIS不同于其他ORM框架的独创性实现;最后就是一些常用的实现,如 TypeHandler类型转化和iBATIS常用工具的实现。
在源码剖析过程中,本书采用了代码注释、UML分析和设计、GoF设计模式抽象和归类、代码跟踪和案例的讲解和说明。其目的是让读者全方位地了解iBATIS的实现框架和实现手段。一方面让读者理解开发者的思路,另一方面也是帮助读者在实际工作中能应用这些策略、方法和编程技巧。
本书适用于软件设计师、架构师和一些有较好Java基础的开发人员,既可以作为iBATIS的学习指南,也可以给软件架构师在设计方面进行参考。
【前言】
搞IT技术已经有十多年的历史了,接触Java语言也有一定的时间了。为什么到现在才要写这本书呢?几年前我开发过一个ORM模型框架,当时的思路居然与iBATIS框架有一些类似(可见英雄所见略同)。于是,为了更好地实现这个ORM框架,我仔细阅读了iBATIS框架的源码。在阅读过程中,由于iBATIS框架代码层层叠叠、峰回路转、跌宕起伏,为了理清框架的主要思路和核心实现方式、加快理解速度和加深理解深度,我用PowerDesigner画了一些UML图,并做了一些阅读笔记和备忘录。一个月下来,基本上从总体架构上了解了iBATIS框架的实现。这时候阅读笔记和备忘录已大约积累了好几万字。我想,如果能把这些笔记和备忘录进行系统化、简单化、章节化的整理,就可以给更多iBATIS爱好者使用。同样,这些学习心得对软件架构师、软件开发工程师等都非常有价值,所谓它山之石,可以攻玉。于是,我决定写一本关于iBATIS框架源码剖析的书籍。而在实际操作中,我觉得在讲述iBATIS源码的同时,已经涉及很多关于ORM的内容,也有一些Java的基础处理和编程技巧,甚至还包括一些经典的设计模式。
在国内介绍和讲述开源软件的书可谓是琳琅满目,不胜枚举。但这些书基本上都归纳为应用型或工具型,更趋向于软件的使用说明或使用指南之类。而且,在全球这么多开源框架代码中,我国做出的贡献还是非常少的。分析原因,主要是我们热衷于拿来主义,直接就用,能解决问题就行。而对于源码,也许只有在使用过程中遇到了障碍,为了解决问题才做一些源码阅读和分析,这也是国内许多人很少去分析开源框架源码的原因,而且介绍开源软件实现的书籍也是凤毛麟角。我写这本书的目的,就是希望在这方面能与大家多分享一些学习心得和体会。
对于开源代码,能读懂并搞明白是一回事。但是理解了源代码,把这些东西用文字表述出来,让别人也能理解却是另一回事。我觉得后者的难度远远大于前者。当然,如果仅仅是简单地介绍iBATIS框架,我相信只要有几句话就能说清楚。但是要把一个实现框架说得条理清晰、层次鲜明,这不仅仅要求有一定的技术背景,还要有文字语言的表达和掌控能力。我用一个月时间就基本上搞明白了iBATIS框架的内容,但是要把它写出来,的确非常头疼。有的时候要非常细致地去推敲,因为很多琐碎的细节决定了整个框架的核心,这需要有一定的耐心和抽象能力。同时阅读和理解程序源码是一种实践性非常强的工作,所谓读书破万卷,下笔如有神,这是一个真理。但若阅读并理解了几十万行程序代码后,再来编写程序代码,那基本上就可以非常有章法并有一定的深度了。事实上,我国大学目前计算机教育的水平是基础性质的,对于如何去阅读源码没有相关的课程来进行讲授。对于源码的分析有什么办法、手段和策略,即如何把那些复杂的程序代码用简单的语言表达出来,让别人能迅速地理解并掌握,我国的教育还是做得不够的,也没有专人或学者来搞这方面的研究。但笔者觉得这项工作是非常重要,而且也是很有意义的。事实上,每个开发人员和设计人员在实践中都有自己的一套读取和分析源码方法。当然这也是仁者见仁、智者见智的事。我的方法和手段只是其中之一而已。所以说我在编写这本书时对源码的剖析只是做了一些非常粗浅但是有意义的尝试,以试图弥补国内软件行业在这方面的缺陷。
当然,阅读本书也要具备一定的基础知识,否则,有些术语和解释还是比较难以理解的。
我在本书的编写过程中花费了大量的时间。而且,这些工作都是在业余时间内完成的,每天都要照常上班,只有到了晚上或者节假日,才有闲暇写这些东西。一般技术人员都喜欢新鲜事物,如果说去阅读和理解开源代码,也许还有一些挑战性,大家可能都有兴趣去做这件事情,但是要把这些东西用文字表述出来并给别人讲述,则许多人就不太愿意干了,原因是这是一项非常枯燥的任务,写作的艰辛旁人是很难理解的。很高兴的是我还是坚持下来了,度过了无数个寂寞和孤单的晚上终于把这本书奉献给了读者。
在这期间,我要感谢我的家人对我的理解和支持。我要感谢我的妻子在这期间承担了全部的家务,同时也要感谢我女儿在我撰写书稿的时候没给我添太多的麻烦,她一直没有搞明白爸爸总是待在电脑前做什么。我要感谢我的父母,他们肯定不知道我写的内容,但是无论我做什么,有没有成绩,他们都是一如既往地给予鼓励。我把这里的一切都献给他们。
我还要感谢本书的编辑高洪霞和顾慧芳。没有她们耐心的指导和完善,这本书也许只是一个读书笔记,我也要感谢本书的策划编辑袁金敏,是她给我信心让我继续下去,否则这些资料只能是束之高阁。我还要感谢那些在编写本书做出贡献的所有人,他们都是默默无闻的后台工作者。
当然,由于笔者水平有限,书中的错误和缺点在所难免,希望读者能给予批评和指正。笔者的联系方式:rengang66@sina.com。
编  者    
2009年12月于北京
【目录】
第一部分  iBATIS的基础知识
第1章  iBATIS概述    2
1.1  iBATIS概论    2
1.2  ORM模型介绍    4
1.2.1  什么是ORM    4
1.2.2  ORM的实现方式    4
1.2.3  常用的ORM框架    8
1.2.4  ORM模型和持久层框架    9
1.3  iBATIS的组件和实现的功能    10
1.3.1  iBATIS的DAO组件    10
1.3.2  iBATIS SQL Map组件    11
第2章  相关的技术背景和基础知识    13
2.1  面向对象和UML基本知识    13
2.1.1  面向对象基础    13
2.1.2  UML基础知识    15
2.1.3  UML图    16
2.1.4  类和接口以及之间的关系    18
2.2  Java基础知识    26
2.2.1  Java的I/O操作    27
2.2.2  Java解析XML文档    27
2.2.3  Java的线程管理    29
2.2.4  Java的反射机制    31
2.2.5  Java的动态Proxy    32
2.2.6  JDBC和JDBC扩展    33
2.2.7  JavaBean    34
2.2.8  JNDI    35
2.3  数据库相关基础知识    37
2.3.1  SQL    37
2.3.2  数据库事务管理    38
2.4  Java EE规范相关知识    39
2.5  开源ORM框架    40
2.5.1  Hibernate    40
2.5.2  TopLink    42
2.5.3  Apache OJB    42
2.6  其他开源框架    43
2.6.1  与Log相关的开源框架    43
2.6.2  OSCache    44
2.6.3  Commons-DBCP数据库连 接池    45
2.7  GoF的23种设计模式    45
第3章  安装和配置iBATIS源码    48
3.1  安装和配置iBATIS SQL Map源码环境    48
3.2  安装和配置iBATIS DAO源码环境    50
3.3  安装和配置iBATIS JPetStore源码环境    51
3.3.1  iBATIS JPetStore源码环境配置    51
3.3.2  创建iBATIS JPetStore的应用    53
3.3.3  安装iBATIS JPetStore的MySQL数据库    53
3.3.4  安装MySQL数据库的管理工具    58
3.3.5  配置成功的标志    60
第二部分  iBATIS DAO框架源码剖析
第4章  iBATIS DAO体系结构和实现    64
4.1  iBATIS DAO基本结构    64
4.1.1  Java EE核心设计模式——DAO模式介绍    65
4.1.2  iBATIS DAO包文件和组件结构    66
4.1.3  使用iBATIS DAO工作流程    67
4.2  iBATIS DAO外部接口和实现    68
4.2.1  iBATIS DAO框架外部接口    68
4.2.2  iBATIS DAO Template API结构和说明    69
4.3  DAO配置文件读取    72
4.3.1  dao.xml的格式说明    72
4.3.2  dao.xml文件的读取过程    73
4.3.3  如何验证dao.xml文件    82
4.3.4  dao.xml配置文件实例说明    84
4.4  iBATIS DAO引擎实现    87
4.4.1  DAO业务实现的序列图和说明    87
4.4.2  iBATIS DAO组件管理    90
4.4.3  iBATIS DAO事务管理实现    94
4.5  基于iBATIS DAO SqlMap的实例说明    124
4.6  读取源码的收获    132
第三部分  iBATIS的底层平台——iBATIS SQL Map的分析
第5章  iBATIS SQL Map体系结构和剖析    134
5.1  SQL Map实现的功能和原理    134
5.2  SQL Map组件的包结构和文件结构    136
5.3  SQL Map的组件结构    137
第6章  SQL Map配置信息的读取    139
6.1  XML文件的验证处理    139
6.1.1  XML验证处理的通用模式    139
6.1.2  iBATIS SQL Map的XML验证    142
6.2  解析SQL Map配置文件    145
6.2.1  SqlMapConfig.xml的格式说明    145
6.2.2  SqlMapConfig.xml文件读取总体说明    147
6.2.3  基于设计模式中策略模式的数据执行    152
6.2.4  基于递归和路径来实现配置文件的全部遍历    157
6.2.5  XmlParserState对象在解析SQL Map XML配置文件的协调者角色    159
6.2.6  配置的一级门面SqlMapConfiguration实例化对象    162
6.2.7  一级应用门面SqlMapExecutorDelegate实例化对象    164
6.2.8  SQL Map配置文件中节点解析的通用处理    165
6.2.9  数据库事务节点的解析和转化    167
6.2.10 配置文件其他节点的解析和转化    170
6.3  解析SQL Map映射文件    178
6.3.1  SQL Map XML映射文件格式    178
6.3.2  SQL Map XML映射文件读取总体说明    182
6.3.3  XmlParserState对象解析SQL Map映射文件的协调者角色    185
6.3.4  cacheModel节点的解析和转化    187
6.3.5  parameterMap节点的解析和转化    194
6.3.6  resultMap节点的解析和转化    200
6.3.7  statement类型节点的解析和转化    212
6.3.8  对SQL的处理    223
6.4  抽象出通用的XML解析
6.4  框架    229
6.5  读取源码的收获    235
第7章  SQL Map引擎实现框架    236
7.1  SQL Map引擎实现框架的
7.1  组成    236
7.2  业务运行过程和介绍    239
7.2.1  总体业务运行过程序列图    239
7.2.2  系统总体运行简化说明图    240
7.3  业务实现类的分析    242
7.3.1  业务实现类    243
7.3.2  配置信息类    254
7.3.3  运行状态信息类    256
7.4  业务实现分析    258
7.4.1  业务实现两个阶段的分析    258
7.4.2  查询类业务实现过程    259
7.4.3  单事务业务操作实现过程    264
7.4.4  联合事务处理实现过程    266
7.4.5  存储过程的处理    272
7.4.6  批处理及其实现    275
7.4.7  全局JTA事务的处理    277
7.4.8  全局外部事务的处理    278
7.4.9  用户自定义数据库Connection处理    279
7.5  读取源码的收获    280
第8章  SQL Map数据库处理    281
8.1  SQL Map的transactionManager    282
8.1.1  Java事务简介    282
8.1.2  SQL Map的transaction Manager概述    282
8.1.3  SQL Map事务管理的设计模式    283
8.2  系统如何调用事务管理和
8.2  SQL Map事务策略    285
8.2.1  SQL Map如何调用事务    285
8.2.2  Java事务类型    286
8.2.3  SQL Map中JDBC事务实现    290
8.2.4  SQL Map中JTA事务实现    293
8.2.5  SQL Map的External事务实现    297
8.2.6  SQL Map的用户事务实现    298
8.3  SQL Map的DataSource策略    298
8.3.1  关于DataSource的说明    298
8.3.2  SQL Map的DataSource结构和内容    300
8.3.3  SIMPLE策略的实现    302
8.3.4  DBCP策略实现    302
8.3.5  JNDI策略实现    304
8.4  SQL Map自定义DataSource实现    306
8.4.1  DataSource接口的结构    306
8.4.2  实现DataSource的设计思路    306
8.4.3  SimpleDataSource设计和实现    308
8.5  SQL Map扩展DataSource为C3P0    322
8.6  SQL Map如何进行批处理    324
8.7  SQL Map事务隔离的实现    327
8.7.1  JDBC事务隔离概述    327
8.7.2  SQL Map的事务隔离的实现    328
8.8  SQL Map事务状态的实现    329
8.9  读取源码的收获    330
第9章  SQL Map中Mapping实现    332
9.1  ParameterMap框架及其说明    333
9.1.1  ParameterMap总体框架说明    333
9.1.2  ParameterMap组件中各个类介绍    334
9.1.3  ParameterMap框架如何工作    335
9.2  ResultMap框架及其说明    338
9.2.1  ResultMap框架介绍    338
9.2.2  ResultMap框架说明    339
9.2.3  ResultMap中的类说明    340
9.2.4  ResultMap框架是如何工作的    341
9.2.5  如何实现子查询    342
9.2.6  延迟加载的实现    345
9.3  Statement框架及其说明    348
9.3.1  Statement介绍    348
9.3.2  Statement框架总体结构    349
9.3.3  Statement组件中的类介绍    350
9.3.4  MappedStatement是如何工作的    354
9.3.5  Statement缓存的实现    361
9.3.6  自动生成的主键    363
9.4  Sql框架及其说明    367
9.4.1  Sql接口框架    367
9.4.2  SqlChild接口框架    368
9.4.3  Sql接口方法    368
9.4.4  静态SQL的实现    369
9.4.5  简单动态SQL的实现    370
9.4.6  动态SQL语言的实现    372
9.5  数据对象转换框架及其说明    379
9.5.1  DataExchange组件作用、内容和设计模式    380
9.5.2  Accessplan组件的
3.3.1  设计模式    393
9.5.3  DataExchange和Accessplan在系统中如何实现    399
9.6  读取源码的收获    404
第10章  SQL Map缓存管理和实现    405
10.1  SQL Map缓存结构和组成    406
10.2  系统如何使用缓存    407
10.2.1  缓存实现的序列图和说明    407
10.2.2  CacheModel类缓存的实现    409
10.2.3  唯一性CacheKey对象的产生    411
10.3  缓存策略的程序实现    412
10.3.1  FIFO缓存实现    413
10.3.2  LRU缓存实现    415
10.3.3  MEMORY缓存实现    417
10.3.4  OSCACHE缓存实现    420
10.4  扩展缓存策略——增加先进后出缓存策略    422
10.5  读取源码的收获    425
第11章  TypeHandler类型转化    426
11.1  Java的数据类型的说明    426
11.2  TypeHandler组件的框架结构    427
11.3  TypeHandlerFactory的结构、作用和实现    428
11.3.1  TypeHandlerFactory的别名处理    428
11.3.2  TypeHandlerFactory容器 的数据类型转化    430
11.4  TypeHandler的实现    431
11.4.1  一般类型的处理    433
11.4.2  Sql类型的处理    434
11.4.3  通用类型的处理    436
11.4.4  定制数据类型的转化    438
11.5  读取源码的收获    440
第12章  iBATIS常用工具的实现    441
12.1  Resources工具    441
12.1.1  资源加载    441
12.1.2  实例化类并缓存    445
12.2  Bean管理    447
12.2.1  ClassInfo类    447
12.2.2  Probe接口及其实现    453
12.3  Log管理    468
12.4  调试信息工具    472
12.5  ScriptRunner的应用    472
12.6  读取源码的收获    476
附录一  第4章  dao-2.dtd    478
附录二  第5章  SqlMapConfig.xml的DTD结构    479
附录三  第5章  SqlMapConfig.xml的XSD结构    484
附录四  第5章  SqlMapMapping.xml的DTD结构    486
附录五  第5章  SqlMapMapping.xml的XSD结构    500
附录六  第11章  JDBC Types Mapped to Java Types    503
附录七  第11章  Java Types
附录七:Mapped to JDBC Types    504
附录八  第11章  JDBC Types Mapped to Java Object 505
附录九  第11章  Java Object TypesMapped to JDBC Types    506
附录十  第11章  JDBC Types Mapped to Database-specific SQL Types    507
参考文献    509
 



 
请使用浏览器的分享功能分享到微信等