Mybatis原始碼分析 trim標籤

2022-05-21 13:09:07 字數 2216 閱讀 3823

在第乙個trim標籤中,存在prefix屬性,那麼語句拼湊為 where id=#

檢查suffix和suffixoverrides,suffixoverrides值為空,那麼不做任何處理,此時會繼續拼接suffix的值,所以sql語句變成where id=# and

在第二個trim標籤中,存在 prefixoverrides="and|or|where",mybatis首先使用豎線'|'分割為陣列,因為1=1 and並不以開頭,所以不做任何處理

在 suffixoverrides="and|or|where"中能夠匹配到 1=1 and中的and字尾,那麼刪除and,sql片段變為1=1

拼接三段sql**,最後結果為:select id,name,age from sstudent where id=? and 1=1

select id,name,age from student 

id=#

1=1and

if>

trim標籤原理實現

分析trimsqlnode原始碼

trimsqlnode類中有五個屬性,對應這當前的節點型別,前字尾屬性值和configuration類,在trimsqlnode構造器中,呼叫了parseoverrides()方法進行解析,可以看到,該方法會將待匹配的prefixestooverride值按|進行分割並放入list中。

1

private

final sqlnode contents;//

當前節點

2private

final string prefix;//

字首名3

private

final string suffix;//

字尾名4

private

final listprefixestooverride;//

待覆蓋字首

5private

final listsuffixestooverride;//

待覆蓋字尾

6private

final

configuration configuration;78

public

trimsqlnode(configuration configuration, sqlnode contents, string prefix, string prefixestooverride, string suffix, string suffixestooverride)

1112

/**13

* 按豎線切割字串

14*

@param

overrides

15*

@return

16*/

17private

static listparseoverrides(string overrides)

25return

list;26}

27return

collections.emptylist();

28 }

在一切屬性都填充完畢後,trimsqlnode就開始正式使用下列方法解析和組裝sql語句了。

@override

filtereddynamiccontext filtereddynamiccontext = new filtereddynamiccontext(context);

return result;

}

private

void

;if (prefixestooverride != null) }

}if (prefix != null) }

}private

void

;if (suffixestooverride != null) }

}if (suffix != null) }

}

where 和set標籤

public

class setsqlnode extends

trimsqlnode

}public

class wheresqlnode extends

trimsqlnode

}

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