宣傳語
iBATIS——目前主流的ORM框架
Java軟體設計師、架構師案頭必備參考用書
內 容 簡 介
本書分為三個部分,第一部分是介紹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框架的內容,但是要把它寫出來,的確非常頭疼。有的時候要非常細緻地去推敲,因為很多瑣碎的細節決定了整個框架的核心,這需要有一定的耐心和抽象能力。同時閱讀和理解程式源碼是一種實踐性非常強的工作,所謂讀書破萬卷,下筆如有神,這是一個真理。但若閱讀並理解了幾十萬行程式代碼後,再來編寫程式代碼,那基本上就可以非常有章法並有一定的深度了。事實上,我國大學目前計算機教育的水平是基礎性質的,對於如何去閱讀源碼沒有相關的課程來進行講授。對於源碼的分析有什麼辦法、手段和策略,即如何把那些複雜的程式代碼用簡單的語言表達出來,讓別人能迅速地理解並掌握,我國的教育還是做得不夠的,也沒有專人或學者來搞這方面的研究。但筆者覺得這項工作是非常重要,而且也是很有意義的。事實上,每個開發人員和設計人員在實踐中都有自己的一套讀取和分析源碼方法。當然這也是仁者見仁、智者見智的事。我的方法和手段只是其中之一而已。所以說我在編寫這本書時對源碼的剖析只是做了一些非常粗淺但是有意義的嘗試,以試圖彌補國內軟體行業在這方面的缺陷。
當然,閱讀本書也要具備一定的基礎知識,否則,有些術語和解釋還是比較難以理解的。
我在本書的編寫過程中花費了大量的時間。而且,這些工作都是在業餘時間內完成的,每天都要照常上班,只有到了晚上或者節假日,才有閒暇寫這些東西。一般技術人員都喜歡新鮮事物,如果說去閱讀和理解開原始碼,也許還有一些挑戰性,大家可能都有興趣去做這件事情,但是要把這些東西用文字表述出來並給別人講述,則許多人就不太願意幹了,原因是這是一項非常枯燥的任務,寫作的艱辛旁人是很難理解的。很高興的是我還是堅持下來了,度過了無數個寂寞和孤單的晚上終於把這本書奉獻給了讀者。
在這期間,我要感謝我的家人對我的理解和支持。我要感謝我的妻子在這期間承擔了全部的家務,同時也要感謝我女兒在我撰寫書稿的時候沒給我添太多的麻煩,她一直沒有搞明白爸爸總是待在電腦前做什麼。我要感謝我的父母,他們肯定不知道我寫的內容,但是無論我做什麼,有沒有成績,他們都是一如既往地給予鼓勵。我把這裡的一切都獻給他們。
我還要感謝本書的編輯高洪霞和顧慧芳。沒有她們耐心的指導和完善,這本書也許只是一個讀書筆記,我也要感謝本書的策劃編輯袁金敏,是她給我信心讓我繼續下去,否則這些資料只能是束之高閣。我還要感謝那些在編寫本書做出貢獻的所有人,他們都是默默無聞的後台工作者。
當然,由於筆者水平有限,書中的錯誤和缺點在所難免,希望讀者能給予批評和指正。
編 者
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.2toplink42
2.5.3 ApacheOJB42
2.6 其他開源框架 43
2.6.1 與Log相關的開源框架 43
2.6.2OSCache44
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 安裝和配置iBATISJpetstore源碼環境 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為c3p0322
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.1DataExchange組件作用、內容和設計模式 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