MyBatis 15 MyBatis的設計模式

2021-10-06 15:17:16 字數 3239 閱讀 1979

工廠模式

**模式

我們知道有3類23種設計模式,我們來看看mybatis原始碼中使用了哪些設計模式

模式mybatis體現

builder模式

例如sqlsessionfactorybuilder、environment

工廠方法模式

例如sqlsessionfactory、transactionfactory、logfactory

單例模式

例如errorcontext、logfactory

**模式

組合模式

例如sqlnode和各個子類choosesqlnode

模板方法模式

例如baseexecutor和******executor,還有basetypehandler和所有子類例如intertypehandler

介面卡模式

例如log的mybatis介面和它對jdbc、log4j等各種日誌框架的適配實現

裝飾者模式

例如cache包中的cache.decorators子包中等各個裝飾者的實現

迭代器模式

例如迭代器模式propertytokenizer

接下來對builder構建者模式、工廠模式、**模式進行解讀,先簡單介紹下模式自身,然後再解讀在mybatis中怎樣應用了該模式

builder模式的定義是將乙個輔助物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示,它屬於建立類模式。一般來說,如果乙個物件的構建比較複雜,超出了建構函式所能包含的範圍,就可以使用工廠模式或builder模式。相當於工廠模式會產出乙個完整的產品,builder模式應用於更加複雜物件的構建,甚至只會侯建產品的乙個部分。直白來說,就是使用多個簡單的物件一步一步構建成乙個複雜物件

例子:使用構建者設計模式來生產computer

主要步驟:

mybatis中的體現

sqlsessionfactory 的構建過程:

private

void

parseconfiguration

(xnode root)

catch

(exception e)

}

在這個過程中,有乙個相似的特點,就是這些builder會讀取檔案或配置,然後做大了的xpathparser解析、配置或者語法解析、反射生成物件、存入結果快取等步驟,這麼多的工作不是乙個建構函式能包括的因此採用了builder模式來解決

在mybatis中比如sqlsessionfactory使用的是工廠模式,該工廠沒有那麼複雜的邏輯,是乙個簡單工廠模式。

簡單工廠模式(****** factory pattern): 又稱靜態工廠方法模式(static factory method),它屬於建立型模式

在簡單工廠模式中,可以根據引數的不同,返回不同類的例項。簡單工廠模式專門定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類

例子:生產電腦

假設有衣蛾電腦的代工生產商,它可以生產聯想電腦,隨著業務的拓展,這個工廠還能生產惠普電腦了,我們可以用乙個單獨的類來專門生產電腦,這就用到了簡單工廠模式。

mybatis體現

有乙個sqlsessionfactory來負責sqlsession的建立

可以看到,sqlsessionfactoryopensession()方法過載了多個,分別支援 autocommit、executortype、transactionisolationlevel等引數的輸入,來構建核心的sqlsession物件。

在defaultsqlsessionfactory 的預設工廠實現裡,有乙個方法可以看出工廠怎麼生產出sqlsession:

private sqlsession opensessionfromdatasource

(executortype exectype, transactionisolationlevel level,

boolean autocommit)

catch

(exception e)

finally

}

這是乙個opensession 呼叫的底層方法,該方法先從 configuration 讀取相應的環境配置,然後初始化 transactionfactory 獲得乙個 transaction 物件,然後通過 transaction 獲取乙個 executor物件,最後通過configuration, executor, autocommit 三個引數構建了 sqlsession

**模式(proxy pattern)給某乙個物件提供乙個**,並由**物件控制對原物件的引用。**模式是一種物件結構型模式,**模式分為靜態**和動態**,我們這裡來介紹下動態**

例子

mybatis體現

package org.apache.ibatis.binding;

public

class

public class()

getmethodcache()

@suppresswarnings

("unchecked"

)protected t newinstance

public t newinstance

(sqlsession sqlsession)

}

package org.apache.ibatis.binding;

public

class

implements

invocationhandler

, serializable

else

if(method.

isdefault()

)}catch

(throwable t)

(method)

;execute

(sqlsession, args);}

...}

MyBatis中的設計模式

builder模式 工廠模式 單例模式 errorcontext和logfactory 模式 組合模式 sqlnode和各個子類choosesqlnode等 模板方法模式 baseexecutor和 executor,還有basetypehandler和所有的子類例如integertypehandl...

MyBatis快取機制的設計

session會話級別的快取,位於表示一次資料庫會話的sqlsession物件之中,即本地快取。一級快取是mybatis內部實現的乙個特性,使用者不能配置,預設自動支援,使用者無定製權利。應用級別的快取,生命週期長,跟應用的生命週期一樣,即作用範圍為整個應用。預設關閉,也不建議使用,一般用redis...

一 MyBatis的整體設計

此文出自感謝chenjc it的整理 1 載入配置並初始化 觸發條件 載入配置檔案 2 接收呼叫請求 觸發條件 呼叫mybatis提供的api 傳入引數 為sql的id和傳入引數物件 處理過程 將請求傳遞給下層的請求處理層進行處理。3 處理操作請求 觸發條件 api介面層傳遞請求過來 傳入引數 為s...