您好,登錄后才能下訂單哦!
這篇“mybatis的executor包語(yǔ)句處理功能源碼分析”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“mybatis的executor包語(yǔ)句處理功能源碼分析”文章吧。
在mybatis
映射文件中傳參數(shù),主要用到#{} 或者 ${}.
#{}:表示使用這種符號(hào)的變量會(huì)以預(yù)編譯的形式賦值到sql片段中。
${}:表示使用這種符號(hào)的變量會(huì)以字符串的形式直接插到sql片段中。
mybatis中支持三種語(yǔ)句類型,不同語(yǔ)句類型支持的變量符號(hào)不同。mybatis的三種類型如下:
STATEMENT
:這種語(yǔ)句類型中,只會(huì)對(duì)sql片段進(jìn)行簡(jiǎn)單的字符串拼接。只支持使用${}.
PREPARED
:這種語(yǔ)句中會(huì)先對(duì)sql片段進(jìn)行字符串拼接,然后再對(duì)sql片段進(jìn)行賦值??梢允褂?{}和${}.
CALLABLE
:這種語(yǔ)句用了實(shí)現(xiàn)執(zhí)行過(guò)程的調(diào)用,會(huì)先對(duì)sql片段進(jìn)行字符串拼接,然后對(duì)sql片段進(jìn)行賦值??梢允褂?{}和${}.
statement
子包負(fù)責(zé)提供語(yǔ)句處理功能,其中StatementHandler
是語(yǔ)句功能類的父接口,RoutingStatementHandler
類是一個(gè)代理類,它能夠根據(jù)傳入的MappedStatement
對(duì)象的具體類型選中一個(gè)具體的被代理對(duì)象,然后將所有實(shí)際操作都委托給被代理對(duì)象。所以RoutingStatementHandler類提供的是路由功能,而路由選擇的依據(jù)就是語(yǔ)句類型。
public class RoutingStatementHandler implements StatementHandler { // 根據(jù)語(yǔ)句類型選取出的被代理類的對(duì)象 private final StatementHandler delegate; public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) { // 根據(jù)語(yǔ)句類型選擇被代理對(duì)象 switch (ms.getStatementType()) { case STATEMENT: delegate = new SimpleStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; case PREPARED: delegate = new PreparedStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; case CALLABLE: delegate = new CallableStatementHandler(executor, ms, parameter, rowBounds, resultHandler, boundSql); break; default: throw new ExecutorException("Unknown statement type: " + ms.getStatementType()); } } }
BaseStatementHandler
作為三個(gè)實(shí)現(xiàn)類的父類,提供了實(shí)現(xiàn)類的公共方法。并且BaseStatementHandler
類使用的模板模式在prepare
方法中定義了整個(gè)方法的框架,然后將一些與子類相關(guān)的操作交給三個(gè)子類處理。
SimpleStatementHandler
類、PreparedStatementHandler
類和CallableStatementHandler
類是三個(gè)真正的statement
處理器,分別處理statement、preparedStatement
、CallableStatement
對(duì)象。通過(guò)其中的parameterize
方法可以看出三個(gè)Statement
處理器的不同。
SimpleStatementHandler
中parameterize
方法的實(shí)現(xiàn)為空,因?yàn)樗恍枰瓿勺址鎿Q即可,不需要進(jìn)行參數(shù)處理
public class SimpleStatementHandler extends BaseStatementHandler { @Override public void parameterize(Statement statement) { // N/A } }
PreparedStatementHandler
中parameterize
方法最終通過(guò)ParameterHandler接口經(jīng)過(guò)多級(jí)中轉(zhuǎn)后調(diào)用了PreparedStatement類中的參數(shù)賦值方法。
public class PreparedStatementHandler extends BaseStatementHandler { @Override public void parameterize(Statement statement) throws SQLException { parameterHandler.setParameters((PreparedStatement) statement); } }
CallableStatementHandler
中parameterize主要是通過(guò)registerOutputParameters方法中轉(zhuǎn)后調(diào)用CallableStatement中的輸出參數(shù)注冊(cè)方法完成輸出參數(shù)的注冊(cè),然后通過(guò)ParameterHandler接口經(jīng)過(guò)多級(jí)中轉(zhuǎn)后調(diào)用了PreparedStatement類中的參數(shù)賦值方法。
public class CallableStatementHandler extends BaseStatementHandler { /** * 對(duì)語(yǔ)句進(jìn)行參數(shù)處理 * @param statement SQL語(yǔ)句 * @throws SQLException */ @Override public void parameterize(Statement statement) throws SQLException { // 輸出參數(shù)的注冊(cè) registerOutputParameters((CallableStatement) statement); // 輸入?yún)?shù)的處理 parameterHandler.setParameters((CallableStatement) statement); } }
以上就是關(guān)于“mybatis的executor包語(yǔ)句處理功能源碼分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。