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