Mybatis技術(shù)內(nèi)幕——筆記(1)
第一章——快速入門
ORM簡(jiǎn)介
傳統(tǒng)JDBC編程
主要步驟:
1.注冊(cè)驅(qū)動(dòng)
2.通過DriverManager打開數(shù)據(jù)庫連接
3.通過數(shù)據(jù)庫連接創(chuàng)建Statement對(duì)象(預(yù)執(zhí)行語句對(duì)象)
4.通過Statement對(duì)象執(zhí)行SQL鲸湃,得到ResultSet結(jié)果對(duì)象
5.ResultSet結(jié)果對(duì)象轉(zhuǎn)換成JavaBean對(duì)象
6.關(guān)閉連接、釋放資源
重點(diǎn)是第5點(diǎn)
1-6的步驟都可以通過一個(gè)工具類去操作统锤,因 為都是通用的涮帘。但第5點(diǎn)無法通用渔隶,不同結(jié)果或者相同結(jié)果映射的JavaBean都可能不同录粱。
所以出現(xiàn)了ORM框架
常見持久化框架
- Hibernate
- JPA
- Spring JDBC
- Mybatis
Mybatis 示例
Mybatis的配置文件
加載衣赶、使用
1.加載,InputStream
2.根據(jù)文件里的配置創(chuàng)建SqlSessionFactory
3.SqlSession創(chuàng)建SqlSesson
4.SqlSession執(zhí)行SQL
5.SqlSession提交事務(wù)
6.關(guān)閉SqlSession對(duì)象
Mybatis 整體架構(gòu)
整體架構(gòu)分為三層:基礎(chǔ)支持層,核心處理層仅孩,接口層
基礎(chǔ)支持層
反射模塊
對(duì)Java反射進(jìn)行了良好封裝托猩,提供了更加簡(jiǎn)潔易用的API,方便調(diào)用杠氢,并對(duì)反射操作進(jìn)行了一系列優(yōu)化站刑。
類型轉(zhuǎn)換模塊
主要功能:
- 別名機(jī)制(為簡(jiǎn)化配置文件)
- 實(shí)現(xiàn)JDBC類型與Java類型間的轉(zhuǎn)換
日志模塊
主要功能就是集成第三方日志框架
資源加載模塊
主要是對(duì)類加載器進(jìn)行封裝,確定類加載器的使用順序鼻百,并提供加載文件以及其他資源文件的功能。
Resources類封裝了類加載器摆尝。
解析器模塊
例如:XPathParser類
主要功能:
- 對(duì)XPath進(jìn)行封裝
- 為處理動(dòng)態(tài)SQL語句中的占位符提供支持
數(shù)據(jù)源模塊
優(yōu)秀的數(shù)據(jù)源組件能提升ORM框架乃至整個(gè)應(yīng)用的性能温艇。
主要是提供相應(yīng)的數(shù)據(jù)源實(shí)現(xiàn),還提供了與第三方數(shù)據(jù)源集成的接口堕汞。
事務(wù)管理
提供了事務(wù)接口和簡(jiǎn)單實(shí)現(xiàn)∩装現(xiàn)在多數(shù)事務(wù)由Spring框架管理,所以主要是事務(wù)接口與Spring的集成
緩存模塊
主要是優(yōu)化數(shù)據(jù)庫性能
Mybatis提供了一級(jí)緩存和二級(jí)緩存讯检。
注意琐鲁!
Mybatis中自帶的這兩級(jí)緩存與Mybatis以及整個(gè)應(yīng)用是運(yùn)行在同一個(gè)JVM中的,共享同一塊堆內(nèi)存人灼。
所有緩存數(shù)據(jù)量過大围段,可能會(huì)影響系統(tǒng)中其他功能。所以優(yōu)化考慮使用Redis投放、Memcashe等緩存產(chǎn)品奈泪。
Binding模塊
Binding模塊將用戶自定義的Mapper接口與映射配置文件關(guān)聯(lián)起來,系統(tǒng)可以通過調(diào)用自定義Mapper接口中的方法執(zhí)行相應(yīng)的SQL語句灸芳。
其實(shí)我還是有點(diǎn)不太明白涝桅,所以后面還要去了解一下
核心處理層
在核心處理層中,實(shí)現(xiàn)了Mybatis的核心處理流程烙样,其中包括Mybatis的初始化以及完成一次數(shù)據(jù)庫操作的涉及的全部流程
配置解析
初始化過程中冯遂,加載Mybatis-config.xml配置文件、映射配置文件谒获、Mapper接口中的注解信息蛤肌,解析后會(huì)形成相應(yīng)的對(duì)象保存到Configuration對(duì)象中。
SQL解析與scriptin模塊
拼湊SQL語句究反、<where>,<if>,<foreach>等的動(dòng)態(tài)生成寻定。
SQL執(zhí)行
SQL的執(zhí)行涉及多個(gè)組件。
Executor主要負(fù)責(zé)維護(hù)一精耐、二級(jí)緩存狼速,并提供事務(wù)管理相關(guān)操作,它會(huì)將數(shù)據(jù)庫相關(guān)操作委托給StatementHandler完成卦停。
StatementHandler通過ParameterHandler完成SQL語句的實(shí)參綁定向胡,然后通過java.sql.Statement執(zhí)行SQL并得到結(jié)果集恼蓬,最后通過ResultSetHandler完成結(jié)果集映射交返回對(duì)象。
插件
Mybatis并不能完美切合所有應(yīng)用場(chǎng)景僵芹,因此可以利用插件對(duì)Mybatis進(jìn)行擴(kuò)展处硬。但要注意,別讓插件影響到Mybatis拇派。
接口層
核心是SqlSession接口
定義了Mybatis暴露給應(yīng)用程序調(diào)用的API