mybatis至少遇到了以下的設計模式的使用。
單例模式,例如errorcontext和logfactory;
組合模式,例如sqlnode和各個子類choosesqlnode等;
模板方法模式,例如baseexecutor和******executor,還有basetypehandler和所有的子類例如integertypehandler;
介面卡模式,例如log的mybatis介面和它對jdbc、log4j等各種日誌框架的適配實現;
裝飾者模式,例如cache包中的cache.decorators子包中等各個裝飾者的實現;
迭代器模式,例如迭代器模式propertytokenizer;
接下來挨個模式進行解讀,先介紹模式自身的知識,然後解讀在mybatis中怎樣應用了該模式。
builder模式的定義是「將乙個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。」,它屬於建立類模式,一般來說,如果乙個物件的構建比較複雜,超出了建構函式所能包含的範圍,就可以使用工廠模式和builder模式,相對於工廠模式會產出乙個完整的產品,builder應用於更加複雜的物件的構建,甚至只會構建產品的乙個部分。
在這個過程中,有乙個相似的特點,就是這些builder會讀取檔案或者配置,然後做大量的xpathparser解析、配置或語法的解析、反射生成物件、存入結果快取等步驟,這麼多的工作都不是乙個建構函式所能包括的,因此大量採用了builder模式來解決。
對於builder的具體類,方法都大都用build*開頭,比如sqlsessionfactorybuilder為例,它包含以下方法:
即根據不同的輸入引數來構建sqlsessionfactory這個工廠物件。
在mybatis中比如sqlsessionfactory使用的是工廠模式,該工廠沒有那麼複雜的邏輯,是乙個簡單工廠模式。
簡單工廠模式(****** factory pattern):又稱為靜態工廠方法(static factory method)模式,它屬於類建立型模式。
在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義乙個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。
可以看到,該factory的opensession方法過載了很多個,分別支援autocommit、executor、transaction等引數的輸入,來構建核心的sqlsession物件。
在defaultsqlsessionfactory的預設工廠實現裡,有乙個方法可以看出工廠怎麼產出乙個產品:
private sqlsession opensessionfromdatasource(executortype exectype, transactionisolationlevel level,
boolean autocommit) catch (exception e) finally else if (isdefaultmethod(method)) catch (throwable t)
, age = #
, birthday = #
where id = $
在這裡面使用到了trim、if等動態元素,可以根據條件來生成不同情況下的sql;
public inte***ce sqlnode else {
name = fullname;
children = null;
indexedname = name;
delim = name.indexof('[');
if (delim > -1) {
index = name.substring(delim + 1, name.length() - 1);
name = name.substring(0, delim);
public string getname() {
return name;
public string getindex() {
return index;
public string getindexedname() {
return indexedname;
public string getchildren() {
return children;
@override
public boolean hasnext() {
return children != null;
@override
public propertytokenizer next() {
return new propertytokenizer(children);
@override
public void remove() {
throw new unsupportedoperationexception(
"remove is not supported, as it has no meaning in the context of properties.");
可以看到,這個類傳入乙個字串到建構函式,然後提供了iterator方法對解析後的子串進行遍歷,是乙個很常用的方法類。
MyBatis中的設計模式
builder模式 工廠模式 單例模式 errorcontext和logfactory 模式 組合模式 sqlnode和各個子類choosesqlnode等 模板方法模式 baseexecutor和 executor,還有basetypehandler和所有的子類例如integertypehandl...
Mybatis中用到的設計模式
mybatis中用到至少用到以下設計模式,單例模式,例如errorcontext和logfactory 組合模式,例如sqlnode和各個子類choosesqlnode等 模板方法模式,例如baseexecutor和 executor,還有basetypehandler和所有的子類例如integer...
Mybatis學習筆記六之設計模式
一 設計模式 在軟體工程領域,設計模式是一套通用的可復用的解決方案,用來解決在軟體設計過程中產生的通用問題。它不是乙個可以直接轉換成源 的設計,只是一套在軟體系統設計過程中程式設計師應該遵循的最佳實踐準則。mybatis原始碼中使用了大量的設計模式,通過觀察設計模式在原始碼中的應用,能夠更深入的理解...