Mybatis原始碼分析之Mapper檔案解析

2022-03-17 01:25:42 字數 3464 閱讀 7891

感覺csdn對markdown的支援不夠友好,總是伴隨各種問題,很惱火!

public void parse() 

parsependingresultmaps();

parsependingchacherefs();

parsependingstatements();

}

上面的這行**是提取部分來解析:

private

void

configurationelement(xnode context) catch (exception e)

}

將各個元素細分,逐一解析:

- parametermapelement方法處理parametermap節點部分

- resultmapelements方法處理resultmap節點部分

- sqlelement處理sql節點部分

- buildstatementfromcontext方法處理select|insert|update|delete部分

重點看看buildstatementfromcontext:

private void buildstatementfromcontext(list

list)

buildstatementfromcontext(list, null);

}private void buildstatementfromcontext(list

list, string requireddatabaseid) catch (incompleteelementexception e) }}

select>

insert>

update>

delete>

單一節點使用xmlstatementbuilder的parsestatementnode來解析,取其中重要的三行**:

listcontents = parsedynamictags(context);

mixedsqlnode rootsqlnode = new mixedsqlnode(contents);

sqlsource sqlsource = new dynamicsqlsource(configuration, rootsqlnode);

private listparsedynamictags(xnode node)  else 

handler.handlenode(child, contents);}}

return contents;

}

if塊是處理text部分,else塊處理其他內嵌node部分:

if>

choose>

....

最終的結果都會新增到list型別的contexts中。xnode形如父子關係,類似鍊錶儲存。

例如:

select pp.permit_cards maxleng,pp.permit_cards currleng

from tb_uhome_parking_place pp

where pp.community_id=# and pp.status='1'

and pp.place_code = #

and pp.place_area= #

if>

select>

body部分:

select pp.permit_cards maxleng,pp.permit_cards currleng 

from tb_uhome_parking_place pp

where pp.community_id=# and pp.status='1'

and pp.place_code = #

取上面的text構成textsqlnode

第二個childnode是if標籤包裹部分,取出來的body為:

and pp.place_area= #
nodehandler handler = nodehandlers.get(nodename);

上面的**獲取ifhandler(對應的還有choosehandler,foreachhandler等)。

handler.handlenode(child, contents);

看看內部類ifhandler會如何處理:

private

class

ifhandler

implements

nodehandler

}

繼續呼叫parsedynamictags,然後構造ifsqlnode,新增到總的contents中。

這時候name為「select」的xnode下解析出的contents包含了三個sqlnode:

利用contents構造mixedsqlnode型別的rootsqlnode。

在dynamicsqlsource的getboundsql方法中有下面一行**:

public

boolean

for (sqlnode sqlnode : contents)

return

true;

}

就是將之前的sqlnode集合contents遍歷處理。這個contents包含兩種型別的sqlnode:textsqlnode和ifsqlnode。

public

boolean

generictokenparser parser = new generictokenparser("$", new bindingtokenparser(context));

return

true;

}

這裡就涉及到引數繫結了,將$替換為實際引數值。

public

boolean

if (evaluator.evaluateboolean(test, context.getbindings()))

return

false;

}

這樣乙個動態sql就構造出來了個大概。後面還有進一步的處理:

sqlsource sqlsource = sqlsourceparser.parse(context.getsql(), parametertype);

主要是針對#部分的處理,後面在」引數繫結「分析時會詳細解讀。

Mybatis 原始碼分析

mybatis解析 2 sqlsessionfactorybean 繼承了 initializingbean 介面,在bean解析的finishbeanfactoryinitialization 的方法對 initializingbean介面中的 afterpropertiesset 方法進行呼叫,...

Mybatis原始碼分析

我們都知道mybatis它是一款優秀的持久層框架,它支援定製化sql 儲存過程以及高階對映,幫我們節省了許多時間與精力,今天我們主要來對mybatis的底層原始碼進行分析,主要是以下4行 首先呼叫resources中的單個string引數的getresuorceasstream string res...

MyBatis 原始碼分析

sqlsession inte ce,代表乙個連線資料庫的會話,提供了乙個預設的 defaultsqlsession sqlsessionfactory inte ct,建立 sqlsessionfactory 的工廠,提供了預設的 defaultsqlsessionfactory建立 defaul...