MyBatis系列之Mybatis原始碼解讀 持久層框架設計實現及mybatis原始碼分析
MyBatis系列之Mybatis原始碼解讀 持久層框架設計實現及mybatis原始碼分析
自定義持久層框架
JDBC問題分析
-
資料庫配置資訊存在硬編碼問題 //解決:配置檔案
-
頻繁建立釋放資料庫連線 //解決:連線池
-
Sql語句、設定引數、獲取結果集引數均存在硬編碼問題 //解決:配置檔案
-
需要手動封裝返回結果集,較為繁瑣 //解決:反射、內省
//內省:即執行時獲取JavaBean的properties,events和methods的過程稱為Java內省。簡而言之,即檢視JavaBean內部的資訊,如方法,屬性,事件。主要用來執行時獲取JavaBean的內部資訊。
自定義持久層框架設計思路
使用端:(專案):自定義持久層框架的jar包
提供兩部分配置資訊:資料庫配置資訊、sql配置資訊:sql語句、引數型別、返回值型別
使用配置檔案來提供這兩部分配置資訊:
1)sqlMapConfig.xml:存放資料庫配置資訊,存放mapper.xml的全路徑
2)Mapper.xml:存放sql配置資訊
自定義持久層框架本身:(工程):本質就是對JDBC進行了封裝
1)載入配置檔案:根據配置檔案的路徑,載入配置檔案成位元組輸入流,儲存在記憶體中
建立Resources類 方法:InputStream getReSourcesAsStream(StrIng path)
2) 建立兩個JavaBean:(容器物件):存放的就是配置檔案解析出來的內容
Configuration:核心配置類:存放sqlMapperConfig.xml解析出來的內容
MapperStatement:對映配置類:存放mapper.xml解析出來的內容
3)解析配置檔案:dom4j
建立類:SqlSessionFactoryBuilder 方法:build(InputStream in)
第一:使用dom4j解析配置檔案,將解析出來的內容封裝到容器物件中
第二:建立SqlSessionFactory物件;生產sqlSession:會話物件(工廠模式)
4)建立SqlSessionFactory介面及實現DefaultSqlSessionFactory
第一:openSession():生產sqlSession
5)建立SqlSession介面及實現類DefaultSession
定義對資料庫的crud操作:selectList()
selectOne()
update()
delete()
6) 建立Executor介面及實現類SimpleExecutor實現類
query(Configuration,MapperStatement,Object...params):執行的就是JDBC程式碼
MyBatis基礎回顧及高階應用
Mybatis動態標籤
Mybatis提供了9種動態的SQL標籤:<if/>,<choose/>,<when/><otherwise/>,<trim/>,<where/>(可刪除sql裡的第一個and),<set/>,<foreach/>,<bind/>
Mybatis註解開發
Mybatis快取
PS:Mybatis會預設開啟一級快取
先查詢使用者,然後修改使用者,再次查詢使用者的時候,不會呼叫第一次快取中的內容,而是對快取進行了修改,重新執行了一條sql語句
一級快取原理探究與原始碼分析
一級快取是什麼?
一級快取的底層資料結構是一個HashMap。
建立流程是什麼?
呼叫query()方法,判斷是否有快取存在,若存在,呼叫,反之,生成。
二級快取回顧
注:二級快取需要手動開啟
註解形式:
Xml形式:
二級快取中快取的不是物件,而是資料,快取命中時,會從二級快取中拿取資料,重新封裝成物件,進行返回。
Mybatis-Redis
為什麼Redis預設檔名為redis.properties?
因為RedisConfigurationBuilder預設先從redis.properties載入相關配置。
Mybatis使用Redis實現二級快取
匯入mybatis-redis依賴,替換mybatis快取實現類
Mybatis外掛
外掛原理:使用動態代理,對原生物件生成代理物件。
以下是Mybatis的四個核心物件
自定義Mybatis外掛
1.使用註解確定需要攔截哪個核心物件的哪個方法,將攔截器生成代理儲存到攔截器鏈中
2.在sqlMapConfig.xml中進行外掛的配置
Mybatis原始碼剖析
主要構件及相互關係
Mybatis層次結構
Mybatis執行Sql流程
Executor原始碼剖析
1)SimpleExecutor:每執行一次update或select,就開啟一個Statement物件,用完立刻關閉Statement物件。
2)ReuseExecutor:執行update或select,以sql作為key查詢Statement物件,存在就使用,不存在就建立,用完後,不關閉Statement物件,而是放置於Map<String,Statement>內,供下一次使用。
3)BatchExecutor:執行update,將所有sql都新增到批處理中,等待統一執行,它快取了多個Statement物件,每個Statement物件都是addBatch()完畢後,等待逐一執行批處理。與JDBC批處理相同。
這三種Executor的作用範圍都在SqlSession生命週期範圍內。
設計模式
Builder
使用多個簡單物件,一步一步構建成一個複雜物件。
主要步驟(以生產computer為例):
1)將需要構建的目標類分成多個部件
2)建立構建類
3)依次建立部件
4)將部件組裝成目標物件
工廠模式
簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。
使用場景:SqlSessionFactory
代理模式
代理(Proxy)是一種設計模式,提供了間接對目標物件進行訪問的方式;即通過代理物件訪問目標物件.這樣做的好處是:可以在目標物件實現的功能上,增加額外的功能補充,即擴充套件目標物件的功能.
這就符合了設計模式的開閉原則,即在對既有程式碼不改動的情況下進行功能的擴充套件。
使用場景:getMapper