1. 程式人生 > 其它 >MyBatis系列之Mybatis原始碼解讀 持久層框架設計實現及mybatis原始碼分析

MyBatis系列之Mybatis原始碼解讀 持久層框架設計實現及mybatis原始碼分析

MyBatis系列之Mybatis原始碼解讀 持久層框架設計實現及mybatis原始碼分析

MyBatis系列之Mybatis原始碼解讀 持久層框架設計實現及mybatis原始碼分析

自定義持久層框架

JDBC問題分析

  1. 資料庫配置資訊存在硬編碼問題 //解決:配置檔案

  1. 頻繁建立釋放資料庫連線 //解決:連線池

  1. Sql語句、設定引數、獲取結果集引數均存在硬編碼問題 //解決:配置檔案

  1. 需要手動封裝返回結果集,較為繁瑣 //解決:反射、內省

//內省:即執行時獲取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

MyBatis系列之Mybatis原始碼解讀 持久層框架設計實現及mybatis原始碼分析

MyBatis系列之Mybatis原始碼解讀 持久層框架設計實現及mybatis原始碼分析

MyBatis系列之Mybatis原始碼解讀 持久層框架設計實現及mybatis原始碼分析