感覺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...