欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis源碼解讀-Java中executor包的語句處理功能

 更新時間:2022年02月18日 09:49:05   作者:灰太狼_cxh  
這篇文章主要介紹了Java中executor包的語句處理功能,在mybatis映射文件中傳參數(shù),主要用到#{}或者${},下文圍繞相關(guān)資料展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下

1.mybatis對多語句類型的支持

在mybatis映射文件中傳參數(shù),主要用到#{} 或者 ${}.

  • #{}:表示使用這種符號的變量會以預(yù)編譯的形式賦值到sql片段中。
  • ${}:表示使用這種符號的變量會以字符串的形式直接插到sql片段中。

mybatis中支持三種語句類型,不同語句類型支持的變量符號不同。mybatis的三種類型如下:

  • STATEMENT:這種語句類型中,只會對sql片段進行簡單的字符串拼接。只支持使用${}.
  • PREPARED:這種語句中會先對sql片段進行字符串拼接,然后再對sql片段進行賦值。可以使用#{}和${}.
  • CALLABLE:這種語句用了實現(xiàn)執(zhí)行過程的調(diào)用,會先對sql片段進行字符串拼接,然后對sql片段進行賦值??梢允褂?{}和${}.

2.mybatis的語句處理功能

statement子包負(fù)責(zé)提供語句處理功能,其中StatementHandler是語句功能類的父接口,RoutingStatementHandler類是一個代理類,它能夠根據(jù)傳入的MappedStatement對象的具體類型選中一個具體的被代理對象,然后將所有實際操作都委托給被代理對象。所以RoutingStatementHandler類提供的是路由功能,而路由選擇的依據(jù)就是語句類型。

public class RoutingStatementHandler implements StatementHandler {

? // 根據(jù)語句類型選取出的被代理類的對象
? private final StatementHandler delegate;

? public RoutingStatementHandler(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
? ? // 根據(jù)語句類型選擇被代理對象
? ? 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作為三個實現(xiàn)類的父類,提供了實現(xiàn)類的公共方法。并且BaseStatementHandler類使用的模板模式在prepare方法中定義了整個方法的框架,然后將一些與子類相關(guān)的操作交給三個子類處理。

SimpleStatementHandler類、PreparedStatementHandler類和CallableStatementHandler類是三個真正的statement處理器,分別處理statement、preparedStatement、CallableStatement對象。通過其中的parameterize方法可以看出三個Statement處理器的不同。

SimpleStatementHandler中parameterize方法的實現(xiàn)為空,因為它只需要完成字符串替換即可,不需要進行參數(shù)處理

public class SimpleStatementHandler extends BaseStatementHandler {

?@Override
? public void parameterize(Statement statement) {
? ? // N/A
? }

? }

PreparedStatementHandlerparameterize方法最終通過ParameterHandler接口經(jīng)過多級中轉(zhuǎn)后調(diào)用了PreparedStatement類中的參數(shù)賦值方法。

public class PreparedStatementHandler extends BaseStatementHandler {
? @Override
? public void parameterize(Statement statement) throws SQLException {
? ? parameterHandler.setParameters((PreparedStatement) statement);
? }
}

CallableStatementHandlerparameterize主要是通過registerOutputParameters方法中轉(zhuǎn)后調(diào)用CallableStatement中的輸出參數(shù)注冊方法完成輸出參數(shù)的注冊,然后通過ParameterHandler接口經(jīng)過多級中轉(zhuǎn)后調(diào)用了PreparedStatement類中的參數(shù)賦值方法。

public class CallableStatementHandler extends BaseStatementHandler {
?/**
? ?* 對語句進行參數(shù)處理
? ?* @param statement SQL語句
? ?* @throws SQLException
? ?*/
? @Override
? public void parameterize(Statement statement) throws SQLException {
? ? // 輸出參數(shù)的注冊
? ? registerOutputParameters((CallableStatement) statement);
? ? // 輸入?yún)?shù)的處理
? ? parameterHandler.setParameters((CallableStatement) statement);
? }

}

到此這篇關(guān)于mybatis源碼解讀-Java中executor包的語句處理功能的文章就介紹到這了,更多相關(guān)executor包語句處理功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中JFinal框架動態(tài)切換數(shù)據(jù)庫的方法

    Java中JFinal框架動態(tài)切換數(shù)據(jù)庫的方法

    這篇文章主要介紹了Java中JFinal框架動態(tài)切換數(shù)據(jù)庫的方法,本文通過兩種方法結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • IDEA插件之mybatisx?插件使用教程

    IDEA插件之mybatisx?插件使用教程

    這篇文章主要介紹了mybatisx?插件使用教程,包括插件安裝自動生成代碼的相關(guān)知識,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Java中的Semaphore信號量使用方法代碼實例

    Java中的Semaphore信號量使用方法代碼實例

    這篇文章主要介紹了Java中的Semaphore信號量使用方法代碼實例,Semaphore是一種基于計數(shù)的信號量,它可以設(shè)定一個閾值,基于此,多個線程競爭獲取許可信號,做自己的申請后歸還,超過閾值后,線程申請許可信號將會被阻塞,需要的朋友可以參考下
    2023-11-11
  • java 創(chuàng)建自定義數(shù)組

    java 創(chuàng)建自定義數(shù)組

    本篇文章是關(guān)于java 如何自己創(chuàng)建自定義數(shù)組,這里給大家一個小實例,希望能幫助有所需要的同學(xué)
    2016-07-07
  • Spring Boot 2.X整合Spring-cache(讓你的網(wǎng)站速度飛起來)

    Spring Boot 2.X整合Spring-cache(讓你的網(wǎng)站速度飛起來)

    這篇文章主要介紹了Spring Boot 2.X整合Spring-cache(讓你的網(wǎng)站速度飛起來),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java中分組統(tǒng)計的三種實現(xiàn)方式

    java中分組統(tǒng)計的三種實現(xiàn)方式

    這篇文章主要介紹了java中分組統(tǒng)計的三種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 深入淺析MyBatis foreach標(biāo)簽

    深入淺析MyBatis foreach標(biāo)簽

    Mybatis foreach 標(biāo)簽用于循環(huán)語句,它很好的支持了數(shù)據(jù)和 List、set 接口的集合,并對此提供遍歷的功能,本文給大家介紹MyBatis foreach標(biāo)簽的相關(guān)知識,感興趣的朋友一起看看吧
    2021-09-09
  • java.lang.NullPointerException 如何處理空指針異常的實現(xiàn)

    java.lang.NullPointerException 如何處理空指針異常的實現(xiàn)

    這篇文章主要介紹了java.lang.NullPointerException 如何處理空指針異常的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • JAVA中重寫(Override)與重載(Overload)的相關(guān)示例

    JAVA中重寫(Override)與重載(Overload)的相關(guān)示例

    這篇文章主要給大家介紹了關(guān)于JAVA中重寫(Override)與重載(Overload)的相關(guān)示例,重寫(override)和重載(overload)是兩種不同的方法重用技術(shù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • 解決RedisTemplate存儲至緩存數(shù)據(jù)出現(xiàn)亂碼的情況

    解決RedisTemplate存儲至緩存數(shù)據(jù)出現(xiàn)亂碼的情況

    這篇文章主要介紹了解決RedisTemplate存儲至緩存數(shù)據(jù)出現(xiàn)亂碼的情況,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評論